R 基于相同的数据帧添加第二个y轴
我正在尝试使用R 基于相同的数据帧添加第二个y轴,r,ggplot2,R,Ggplot2,我正在尝试使用ggplot2创建一个箱线图,并且需要从同一数据帧获得两个轴,表示两个不同的比例。基本上,我正在绘制三个附属物的每两种不同物种的表面积与体积比,其中一个附属物与其他两个附属物相比具有非常高的SA:V比,这使得很难将它们全部放在同一张图上 我已经为箱线图重新创建了数据和代码,以演示我所说的内容。如果可能的话,我想把背鳍显示在同一个图表上,但是在不同的y轴比例上(也会显示在图表上),这样箱线图的方框都是可见的 SAV <- c(seq(.35, .7, .01), seq(.09
ggplot2
创建一个箱线图,并且需要从同一数据帧获得两个轴,表示两个不同的比例。基本上,我正在绘制三个附属物的每两种不同物种的表面积与体积比,其中一个附属物与其他两个附属物相比具有非常高的SA:V比,这使得很难将它们全部放在同一张图上
我已经为箱线图重新创建了数据和代码,以演示我所说的内容。如果可能的话,我想把背鳍显示在同一个图表上,但是在不同的y轴比例上(也会显示在图表上),这样箱线图的方框都是可见的
SAV <- c(seq(.35, .7, .01), seq(.09, .125, .001), seq(.09, .125, .001))
Type <- c(rep("Pectoral Fin", 36), rep("Dorsal fin", 36), rep("Fluke", 36))
Species <- c(rep(c(rep("Sp1", 18), rep("Sp2", 18)), 3))
appendage <- data.frame(SAV, Type, Species)
ggplot(aes(y = appendage$SAV,
x = factor(appendage$Type, levels = c("Dorsal fin", "Fluke")),
fill = appendage$Species),
data = appendage) +
geom_boxplot(outlier.shape = NA) +
labs(y = expression("SA:V("*cm^-1*")"), x="") +
scale_x_discrete(labels = c("PF", "DF", "F")) +
scale_fill_manual(values = c("black", "gray"))
SAV一种可能性是使用facet\u wrap
appendage %>%
mutate(
Type = factor(Type,
levels = c("Dorsal fin", "Fluke", "Pectoral Fin"),
labels = c("DF", "PF", "F"))) %>%
ggplot(aes(Type, SAV, fill = Species)) +
geom_boxplot(outlier.shape=NA) +
labs(y=expression("SA:V("*cm^-1*")"),x="") +
scale_fill_manual(values=c("black","gray")) +
facet_wrap(~Type, scales="free") +
theme(axis.ticks.x = element_blank(),
strip.background = element_blank(),
strip.text.x = element_blank())
首先,像其他人评论的那样,我不推荐这种类型的绘图。双轴倾向于使比较更加困难&即使观众意识到这一点,也会在视觉上混淆他们
也就是说,使用ggplot2
可以实现这一点&一旦我们在原始代码中解决了其他几个问题,我将在下面展示一种方法:
问题1:您正在将数据帧传递给ggplot()
。在这种情况下,美元符号$
在aes()
中没有位置
而不是:
ggplot(aes(y = appendage$SAV,
x = factor(appendage$Type), # ignore the levels for now; see next issue
fill = appendage$Species),
data = appendage) +
...
ggplot(aes(y = SAV,
x = factor(Type, levels = c("Dorsal fin", "Fluke")),
fill = Species),
data = appendage) +
...
使用:
第二期:哪一个附属物的SA:V异常高
根据用于生成示例数据集的代码,它应该是“胸鳍”,但最终结果显示为“DF”。我假设完整术语和轴标签之间的映射为:
- “胸鳍”->“胸鳍”
- “背鳍”->“DF”
- “Fin”->“F”
。。。因此,这看起来像是在aes()
中将Type作为x参数的一个因子传递给x参数,以及在scale\u x\u discrete()
中设置轴标签之间的失误
因为您使用的是factor()
,所以在那里设置标签也会更整洁。把它放在同一个地方会使这些东西更容易被发现
而不是:
ggplot(aes(y = appendage$SAV,
x = factor(appendage$Type), # ignore the levels for now; see next issue
fill = appendage$Species),
data = appendage) +
...
ggplot(aes(y = SAV,
x = factor(Type, levels = c("Dorsal fin", "Fluke")),
fill = Species),
data = appendage) +
...
使用:
我改变了因子的顺序,因为我觉得与次要y轴(通常在右侧)相对应的x轴类别在视觉上更合理,它位于其他x轴类别的右侧。如果这不是理想的情况,您可以更改它。只需确保同时更改级别=…
和标签=…
次级y轴的解决方案
手动重新缩放有问题的附件(无论是哪个鳍)的值,直到其范围与其他附件的范围相似。(在下面的示例中,我使用了y/5
的简单除法,但也可以使用更复杂的函数。)
为y轴指定sec.axis()
选项,使用重缩放函数的倒数作为变换。(在这种情况下,y*5
)
相应地标记原始y轴(左)和次y轴(右),以明确每个轴的比例适用于哪些附件
最终代码+结果:
k = 5 #rescale factor
ggplot(aes(y = ifelse(Type == "Pectoral Fin",
SAV / k, SAV),
x = factor(Type,
levels = c("Dorsal fin", "Fluke", "Pectoral Fin"),
labels = c("DF", "F", "PF")),
fill = Species),
data = appendage) +
geom_boxplot(outlier.shape = NA) +
scale_y_continuous(sec.axis = sec_axis(trans = ~. * k,
name = expression("SA:V ("*cm^-1*") PF"))) +
labs(y = expression("SA:V ("*cm^-1*") DF / F"), x = "") +
scale_fill_manual(values = c("black", "gray"))
虽然@hpesoj626的答案可能就是您想要的答案,但您确实需要告诉您的听众不同的等级-这样他们就不会误解数据(人们可能会浏览等级)。我甚至可能建议做单独的图表。我同意这可能会让人困惑。我唯一不安的是,在我的分析中,我有类似的格式图,我希望它们是一致的。但我要看看最终的结果是什么样子,然后从那里开始!谢谢你的意见:)非常感谢!有没有办法把这三张图合并成左边0.09-0.12的比例和0.4-0.7的比例?我想我不明白你说的@user33993是什么意思。但是,正如您在OP中所评论的,单独的箱线图可能更适合您的情况。