ggplot2 中两个数据集具有不同比例的两个 y 轴

ali*_*boy 1 r ggplot2

我有两个共享公共 x 值的数据集(可以合并为一个),而 y 值不同 - 我想在一个数据集中绘制 y 值并将 y 轴放在图的左侧,而绘制另一个数据集中的 y 值,并将 y 轴放在同一图的右侧。当然,两个y轴值的相对比例是不同的(实际上应该根据第一个数据集中的y值“调整”。两个数据集中的点会用不同的颜色来区分这两个比例.

一个例子如下所示:

d1 = data.frame(x=c(100, 200, 300, 400), y=seq(0.1, 0.4, by=0.1)) # 1st dataset
d2 = data.frame(x=c(100, 200, 300, 400), y=seq(0.8, 0.5, by=-0.1)) # 2nd dataset
p1 = ggplot(data = d1, aes(x=x, y=y)) + geom_point()
p2 = ggplot(data = d2, aes(x=x, y=y)) + geom_point() +
  scale_y_continuous(position = "right")
p1
p2
Run Code Online (Sandbox Code Playgroud)

ggplot2,我不能这样做,p1+p2因为它会显示一条错误消息Error: Don't know how to add o to a plot。请帮忙。谢谢!

在此处输入图片说明

r2e*_*ans 9

在前面,这种类型的图是一个很好的例子,说明为什么要花这么长时间才能进入第二个轴ggplot2:它很容易混淆,导致误解。因此,我将在这里煞费苦心地提供多种指标,说明什么东西去哪里了。

首先,使用sec_axis需要对原轴进行变换。这通常以截距/斜率公式的形式完成,例如~ 2*. + 10,其中周期表示要缩放的值。在这种情况下,我认为我们可以简单地逃脱~ 2*.

但是,这意味着您需要在原始轴上绘制所有数据,这意味着您需要d2$y预先缩放到d1$y的限制。很简单,您只需要像sec_axis.

不过,为了使用ggplot2's grouping ,我将把数据合并到一个 data.frame 中。

d1 = data.frame(x=c(100, 200, 300, 400), y=seq(0.1, 0.4, by=0.1)) # 1st dataset
d2 = data.frame(x=c(100, 200, 300, 400), y=seq(0.8, 0.5, by=-0.1)) # 2nd dataset
d1$z <- "data1"
d2$z <- "data2"
d3 <- within(d2, { y = y/2 })
d4 <- rbind(d1, d3)
d4
#     x    y     z
# 1 100 0.10 data1
# 2 200 0.20 data1
# 3 300 0.30 data1
# 4 400 0.40 data1
# 5 100 0.40 data2
# 6 200 0.35 data2
# 7 300 0.30 data2
# 8 400 0.25 data2
Run Code Online (Sandbox Code Playgroud)

为了控制所有组件中的颜色,我将手动设置它:

mycolors <- c("data1"="blue", "data2"="red")
Run Code Online (Sandbox Code Playgroud)

最后,剧情:

library(ggplot2)
ggplot(d4, aes(x=x, y=y, group=z, color=z)) +
  geom_path() +
  geom_point() +
  scale_y_continuous(name="data1", sec.axis = sec_axis(~ 2*., name="data2")) +
  scale_color_manual(name="z", values = mycolors) +
  theme(
    axis.title.y = element_text(color = mycolors["data1"]),
    axis.text.y = element_text(color = mycolors["data1"]),
    axis.title.y.right = element_text(color = mycolors["data2"]),
    axis.text.y.right = element_text(color = mycolors["data2"])
  )
Run Code Online (Sandbox Code Playgroud)

带有两个轴的示例图形

不过,坦率地说,我不喜欢不同的斜坡。也就是说,蓝色轴上的两个块是 0.1,而在红色轴上它们是 0.2。如果您在谈论两种截然不同的“事物”,那么这可能没问题。但是,如果两条线的斜率可以直接比较,那么您可能更愿意保持每个块的大小相同。为此,我们将使用截距变换,斜率不变。这意味着 in-data.frame 转换可能是y = y - 0.4,而绘图补充~ . + 0.4,产生:

另一个带有两个轴的示例图形

PS:来自/sf/answers/3197856581//sf/answers/484403181/ 的提示

  • 这实际上是为什么双轴图如此具有误导性的一个很好的例子。在同一轴上绘制,您会看到这些线甚至不交叉……大脑不禁将向上交叉解释为一组变得“大于”,即使轴上显示了值。 (2认同)

归档时间:

查看次数:

16323 次

最近记录:

7 年,3 月 前