0

我已将辅助轴调整为添加系数 /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"))

在此处输入图像描述

4

2 回答 2

1

ggplot2 不容易使用第二个 y 轴。sec_axis()基本上只是将另一个比例粘在您的图表上,您geom_line(aes(Days, B, color = "B"), size = 0.6) + geom_point(aes(Days, B))不会与它“交互”。DaveArmstrong 的解决方案可能在您想要使用具有不同比例的两个图形的所有情况下效果最佳。在这种情况下,您的系数 /100 仅适用于您的第二个比例。在这种情况下,将该系数添加到您的图表中应该可以工作,因为 B 图表仍然使用主 y 轴绘制:

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"))

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

于 2022-01-26T12:05:27.547 回答
1

我通常这样做的方法是制作一对从 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

然后,我们在 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()had fill="grey",但您实际上可以删除它,因为您正在使用该scale_colour_manual()函数定义颜色。在这个与分组条形图有关的答案和与分组箱形图有关的这个答案中也进行了讨论。

于 2022-01-26T11:19:05.940 回答