我有两个数据集(可以组合成一个),它们共享共同的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
在ggplot2
中,我无法p1+p2
,因为它会显示错误消息Error: Don't know how to add o to a plot
。请帮忙。谢谢!
答案 0 :(得分:3)
在前面,这种类型的图表是为什么花费这么长时间将第二个轴转换为ggplot2
的一个很好的例子:它很容易混淆,导致错误的解释。因此,我会在这里努力提供多种指标,指出去哪里。
首先,使用sec_axis
需要在原始轴上进行转换。这通常以截距/斜率公式的形式完成,例如~ 2*. + 10
,其中周期表示要缩放的值。在这种情况下,我认为我们可以简单地使用~ 2*.
但是,这意味着您需要在原始轴上绘制所有数据,这意味着您需要将d2$y
预先缩放到d1$y
的限制。很简单,您只需要在sec_axis
中使用反向转换。
我打算将数据合并到一个data.frame中,以便使用ggplot2
的分组。
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
为了控制所有组件的颜色,我会手动设置它:
mycolors <- c("data1"="blue", "data2"="red")
最后,情节:
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"])
)
但坦率地说,我不喜欢不同的斜坡。也就是说,蓝轴上的两个块是0.1,而在红轴上它们是0.2。如果您正在谈论两个截然不同的事情,那么这可能没什么问题。但是,如果两条线的斜率可以直接比较,那么您可能更愿意保持每个块的大小相同。为此,我们将使用仅仅截距的变换,斜率没有变化。这意味着in-data.frame转换可能是y = y - 0.4
,而补集~ . + 0.4
,产生:
PS:来自https://stackoverflow.com/a/45683665/3358272和https://stackoverflow.com/a/6920045/3358272
的提示