Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 基于相同的数据帧添加第二个y轴_R_Ggplot2 - Fatal编程技术网

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中所评论的,单独的箱线图可能更适合您的情况。