我想在同一页面上使用相同的图例绘制两个ggplot2。 http://code.google.com/p/gridextra/wiki/arrangeGrob描述了如何做到这一点。这看起来不错。但是......在我的例子中,我有两个具有相同x轴和不同y轴的图。当y轴的范围至少比另一个图的10倍(例如10000而不是1000)时,ggplot2(或网格?)不能使图正确对齐(参见下面的输出)。
如何使用两个不同的y轴对齐绘图的左侧?
x = c(1, 2)
y = c(10, 1000)
data1 = data.frame(x,y)
p1 <- ggplot(data1) + aes(x=x, y=y, colour=x) + geom_line()
y = c(10, 10000)
data2 = data.frame(x,y)
p2 <- ggplot(data2) + aes(x=x, y=y, colour=x) + geom_line()
# Source: http://code.google.com/p/gridextra/wiki/arrangeGrob
leg <- ggplotGrob(p1 + opts(keep="legend_box"))
legend=gTree(children=gList(leg), cl="legendGrob")
widthDetails.legendGrob <- function(x) unit(3, "cm")
grid.arrange(
p1 + opts(legend.position="none"),
p2 + opts(legend.position="none"),
legend=legend, main ="", left = "")
答案 0 :(得分:10)
以更通用的方式执行相同操作的更简洁方法是使用格式化程序arg:
p1 <- ggplot(data1) +
aes(x=x, y=y, colour=x) +
geom_line() +
scale_y_continuous(formatter = function(x) format(x, width = 5))
对第二个绘图执行相同的操作,并确保设置宽度&gt; =两个绘图中预期的最宽数字。
答案 1 :(得分:7)
如果你不介意无耻的kludge,只需在p1
中的最长标签上添加一个额外的字符,如下所示:
p1 <- ggplot(data1) +
aes(x=x, y=y, colour=x) +
geom_line() +
scale_y_continuous(breaks = seq(200, 1000, 200),
labels = c(seq(200, 800, 200), " 1000"))
我有两个基本问题,如果你有理由我希望你会原谅我们:
1)为什么不在两者上使用相同的y轴?我觉得这是一种更直接的方法,通过将scale_y_continuous(limits = c(0, 10000))
添加到p1
,可以轻松实现上述示例。
2)facet_wrap
提供的功能在这里不够用吗?很难知道你的数据结构实际上是什么样的,但这里是我如何做到这一点的玩具示例:
library(ggplot2)
# Maybe your dataset is like this
x <- data.frame(x = c(1, 2),
y1 = c(0, 1000),
y2 = c(0, 10000))
# Molten data makes a lot of things easier in ggplot
x.melt <- melt(x, id.var = "x", measure.var = c("y1", "y2"))
# Plot it - one page, two facets, identical axes (though you could change them),
# one legend
ggplot(x.melt, aes(x = x, y = value, color = x)) +
geom_line() +
facet_wrap( ~ variable, nrow = 2)
答案 2 :(得分:7)
1。使用cowplot包:
library(cowplot)
plot_grid(p1, p2, ncol=1, align="v")
2。使用ggbio包中的tracks
:
注意:似乎有一个错误,x刻度不对齐。 (2016年3月17日测试,ggbio_1.18.5)
library(ggbio)
tracks(data1=p1,data2=p2)
答案 3 :(得分:0)
ggbio解决您问题的方法是按以下方式修复原始图的x轴坐标:
library(ggbio)
p1 <- f()
fixed(p1) <- TRUE
p2 <- f()
fixed(p2) <- TRUE
tracks(p1,p2)
最佳,
Yatrosin