为什么 geom_line 数据没有根据 R 中创建的辅助轴绘制?

Why geom_line data is not plotting according to the secondary axis created in 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))
)

接下来,估计两个线性模型,我们在其中计算从一个变量的 space 转换为另一个变量的系数。然后我们可以创建计算转换的函数。

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

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

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() 函数定义颜色。 relating to grouped bar plots and this answer 中还讨论了与分组箱线图有关的内容。

ggplot2 不容易与第二个 y-axis 一起工作。 sec_axis() 基本上只是将另一个比例尺粘贴到您的图表上,您的 geom_line(aes(Days, B, color = "B"), size = 0.6) + geom_point(aes(Days, B)) 不会 'interact'。 DaveArmstrong 的解决方案可能在您想要使用两个具有不同比例的图形的所有情况下都发挥最佳作用。在这种情况下,您的系数 /100 仅适用于您的第二个量表。 在这种情况下,将该系数添加到您的图形中应该可行,因为 B 图仍使用主要 y-axis:

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

但请注意,对于 bigger/more 复杂的图形,此解决方案将无法正常工作或根本无法工作。