为什么GEOM_LINE数据没有按照在R中创建的二次轴绘制? [英] Why geom_line data is not plotting according to the secondary axis created in R?

查看:17
本文介绍了为什么GEOM_LINE数据没有按照在R中创建的二次轴绘制?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已将次轴调整为添加系数/100的单位。但是,数据点(B)不是根据次轴绘制的,并且仍然很小。

data<- data.frame(
      Days=(1:10),
      A=c(34,1,22,1,3,0,2,5,0,8),
      B= c(0.2,0.2,0.2,0.2,0.3,0.3,0.2,0.1,0.1,0.3))


coeff2<- 100
ggplot(data) + 
  geom_line(aes(Days, A, color = "A"), fill = "grey") +
  geom_point(aes(Days, A))+
  geom_line(aes(Days, B, color = "B"), size = 0.6) +
  geom_point(aes(Days, B))+
  theme_classic() + 
  scale_y_continuous(name = "A",
    sec.axis = sec_axis(~./coeff2, name="B"))+
  scale_color_manual(name = "", values = c("A" = "darkgrey", "B" = "black"))

推荐答案

我通常的方法是制作一对从B到A和从A到B的映射。为此,如果您希望两个轴都从零开始,您应该首先创建一个只有两个观测值的数据集,第一个是每个变量的最小值,第二个是最大值。如果希望两个轴都从零开始,则应该使用零作为最小值,否则可以使用数据中观察到的最小值。例如,

tmp <- data.frame(
  A = c(0, max(data$A)), 
  B = c(0, max(data$B))
)
接下来,估计两个线性模型,我们在其中计算从一个变量空间到另一个变量空间的系数。然后我们可以制作将计算转换的函数。

itmod <- lm(A ~ B, data=tmp)
tmod <- lm(B ~ A, data=tmp)
trans <- function(x)coef(tmod)[1] + coef(tmod)[2]*x
invtrans <- function(x)coef(itmod)[1] + coef(itmod)[2]*x

然后,我们在gggraph中使用这些函数:

ggplot(data) + 
  geom_line(aes(Days, A, color = "A")) +
  geom_point(aes(Days, A))+
  geom_line(aes(Days, invtrans(B), color = "B"), size = 0.6) +
  geom_point(aes(Days, invtrans(B)))+
  theme_classic() + 
  scale_y_continuous(name = "A",
                     sec.axis = sec_axis(trans=trans, name="B"))+
  scale_color_manual(name = "", values = c("A" = "darkgrey", "B" = "black"))

还请注意,在您的原始代码中,对geom_line()的第一个调用具有fill="grey",但您实际上可以删除它,因为您使用scale_colour_manual()函数定义颜色。this answer中还讨论了与分组条形图有关的内容,this answer与分组框图有关。

这篇关于为什么GEOM_LINE数据没有按照在R中创建的二次轴绘制?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆