如何在第二个y轴上添加第二条平滑线,并使用ggplot2在第一条y轴上对其进行缩放?

时间:2019-11-14 11:56:57

标签: r ggplot2 smoothing

我有一个数据框df,该数据框总结了鱼类的活动Activity以及与水列中与该活动相关的当前强度C.I和当前方向C.D 。作为数据框的示例:

df<- data.frame(C.D=c(5,5,5,10,10,10,20,20,20,40,40,40,80,80,80,100,100,100,130,130,130,160,160,160,190,190,190,220,220,220,250,250,250,280,280,280,310,310,310,340,340,340,359,359,359),
                Activity=c(1.1,1.6,0.6,1.2,1.8,1.3,1.3,1.4,1.88,0.99,1.8,2.1,1.75,1.5,2.4,1.55,0.9,2.4,1.4,1.5,3.2,1.7,2.1,3.8,2.8,3.9,2.1,3.4,2.6,4.1,2.3,3.6,4.3,3.0,2.4,1.8,2.5,1.6,1.1,0.5,1.4,2.3,0.8,2.1,1.5),
                C.I=c(0.05,0.21,0.11,0.2,0.15,0.28,0.24,0.18,0.33,0.11,0.22,0.13,0.16,0.31,0.23,0.15,0.28,0.36,0.25,0.31,0.58,0.42,0.36,0.52,0.58,0.82,0.71,0.64,0.51,0.4,0.54,0.55,0.68,0.32,0.21,0.23,0.37,0.22,0.15,0.21,0.24,0.18,0.04,0.6,0.12))

df

   C.D Activity  C.I
1    5     1.10 0.05
2    5     1.60 0.21
3    5     0.60 0.11
4   10     1.20 0.20
.    .       .    .
.    .       .    .
.    .       .    . 

我想探讨电流C.D的方向是否影响我鱼类的活动。例如,如果某个C.D的活动比其他活动高。但是,由于C.DC.I可能非常相关(对于某些C.D,电流C.I的强度可能高于其他强度),因此我需要添加绘制有关C.I的信息,以解释我看到的是由于变量C.D的影响还是由于第三个变量C.I的影响。

作为第一近似值,我绘制了C.DActivity之间的关系点,并添加了一条平滑线以查看总体趋势。我还根据C.I对点进行了着色,以查看颜色是否遵循某种模式(例如,如果特定的颜色集中在特定的C.D中,这意味着某些C.I仅在特定的情况下出现C.D)。在此示例中,C.I的高C.D ara在140和250等级之间。代码和图像如下:

P<- ggplot(df, aes(C.D, Activity)) +
  geom_point(aes(C.D, Activity, color = C.I)) + scale_colour_gradientn(colours=c("green","black")) + theme_bw()
P<- P +  geom_smooth()  +
  ggtitle("Mean activity as a function of C.D.20m for winter from hourly data") +
  theme(plot.title = element_text(hjust = 0.5)) 

enter image description here

当我必须绘制成千上万个点时,就会出现我的问题,因为从那时起,为这些点使用颜色来显示与C.I相关的任何C.D模式是不合适的。这里显示了我的数据的真实图:

enter image description here

我的问题是我如何添加关于第一个y轴缩放的第二条平滑线,以显示C.DC.I之间的关系。到目前为止,我已经知道了:

P<- P + geom_smooth(aes(C.D, C.I), color="red", se=FALSE)
P

enter image description here

是否可以缩放第二个y轴以改善解释?

1 个答案:

答案 0 :(得分:1)

首先,我想指出其他地方在this answer中表示的辅助轴所伴随的常见警告。

仅仅是变换数据并逆变换辅助轴是不合适的吗?

请注意6是转换的任意数字,以使数据看起来合理。

ggplot(df, aes(C.D, Activity)) +
  geom_point(aes(C.D, Activity, color = C.I)) + 
  scale_colour_gradientn(colours=c("green","black")) + 
  theme_bw() + 
  geom_smooth()  +
  ggtitle("Mean activity as a function of C.D.20m for winter from hourly data") +
  theme(plot.title = element_text(hjust = 0.5)) +
  geom_smooth(aes(C.D, C.I * 6), se=FALSE, colour = "red", show.legend = TRUE) +
  scale_y_continuous(sec.axis = sec_axis(trans = ~ . / 6, name = "CI"))

enter image description here

编辑:对于这些行的正确说明,恐怕您将不得不做一些手动指定(除非其他人有一个更优雅的解决方案):

ggplot(df, aes(C.D, Activity)) +
  geom_point(aes(C.D, Activity, color = C.I)) + 
  scale_colour_gradientn(colours=c("green","black")) + 
  theme_bw() + 
  geom_smooth(aes(linetype = "Activity"))  +
  ggtitle("Mean activity as a function of C.D.20m for winter from hourly data") +
  theme(plot.title = element_text(hjust = 0.5)) +
  geom_smooth(aes(C.D, C.I * 6, linetype = "C.I."), se=FALSE, colour = "red", show.legend = TRUE) +
  scale_y_continuous(sec.axis = sec_axis(trans = ~ . / 6, name = "CI")) +
  scale_linetype_manual(
    values = c(1,1), 
    guide = guide_legend(override.aes = list(colour = c("blue", "red")))
  )

enter image description here