如何使用ggplot2在当前情节中使用之前绘图的比例?

时间:2014-05-15 04:21:23

标签: r ggplot2 scale facet

我正在使用ggplot2制作一个有3个方面的情节。因为我正在比较两个不同的数据集,所以我希望能够使用与第一个图中相同的y比例绘制第二个数据集。但是,我找不到一种简单的方法来保存第一个绘图的设置,然后在第二个绘图中重复使用它们。由于每个方面都有自己的y刻度,因此在第二个绘图中手动指定它们会很痛苦。有谁知道重新使用秤的快速方法?为了使这个具体,这是我如何产生我的情节:

p <- ggplot(mtcars, aes(mpg, wt)) + geom_point()
p + facet_wrap(~ cyl, scales = "free_y")

enter image description here

修改

当应用以下建议之一时,我发现我的问题比原始帖子中描述的更具体,并且它必须专门用于缩放误差条。具体地说,当我按照建议重新缩放第二个绘图时,误差条看起来很奇怪。 有没有人对如何为两个图表保持相同的比例有任何建议,并且正确显示错误条?我附上以下示例的具体内容:

#Create sample data
d1 <- data.frame(fixtype=c('ff','ff','fp','fp'), detype=c('det','pro','det','pro'),
             diffscore=c(-1,-15,3,-17),se=c(2,3,1,2))
d2 <- data.frame(fixtype=c('ff','ff','fp','fp'), detype=c('det','pro','det','pro'),
             diffscore=c(-1,-3,-2,-1),se=c(4,3,5,3))

#Plot for data frame 1, this is the scale I want to keep
lim_d1 <- aes(ymax = diffscore + se, ymin=diffscore - se)
ggplot(d1, aes(colour=detype, y=diffscore, x=detype)) + 
geom_point(aes(size=1), shape=15) +
geom_errorbar(lim_d1, width=0.2,size=1) +
facet_wrap(~fixtype, nrow=2, ncol=2, scales = "free_y")

Plot for data frame 1

#Plot for data frame 2 original scale
lim_d2 <- aes(ymax = diffscore + se, ymin=diffscore - se)
ggplot(d2, aes(colour=detype, y=diffscore, x=detype)) + 
  geom_point(aes(size=1), shape=15) +
  geom_errorbar(lim_d2, width=0.2,size=1) +
  facet_wrap(~fixtype, nrow=2, ncol=2, scales = "free_y")

Plot for data frame 2

#Plot for data frame 2 adjusted scale. This is where things go wrong!
#As suggested below, first I plot the first plot, then I draw a blank screen and try
#to plot the second data frame on top. 
lim_d2 <- aes(ymax = diffscore + se, ymin=diffscore - se)
ggplot(d1, aes(colour=detype, y=diffscore, x=detype)) + 
  geom_blank() +
  geom_point(data=d2, aes(size=1), shape=15) +
  geom_errorbar(lim_d2, width=0.2,size=1) +
  facet_wrap(~fixtype, nrow=2, ncol=2, scales = "free_y")

Plot for data frame 2, messed up error bars

#If the error bars are fixed, by adding data=d2 to geom_errorbar(), then
#the error bars are displayed correctly but the scale gets distorted again
lim_d2 <- aes(ymax = diffscore + se, ymin=diffscore - se)
ggplot(d1, aes(colour=detype, y=diffscore, x=detype)) + 
  geom_blank() +
  geom_point(data=d2, aes(size=1), shape=15) +
  geom_errorbar(data=d2,lim_d2, width=0.2,size=1) +
  facet_wrap(~fixtype, nrow=2, ncol=2, scales = "free_y")

enter image description here

2 个答案:

答案 0 :(得分:3)

您可以先在原始数据上调用ggplot,然后将geom_blank添加为第一层。这将根据ggplot中提供的数据设置绘图区域,其中包含轴和图例。

然后添加使用原始数据以外的数据的geom。在示例中,我使用原始数据的简单subset

来自?geom_blank:“空白的geom什么都没有,但可以成为确保不同地块之间共同比例的有用方法。”

ggplot(data = mtcars, aes(mpg, wt)) +
  geom_blank() +
  geom_point(data = subset(mtcars, wt < 3)) +
  facet_wrap(~ cyl, scales = "free_y")

答案 1 :(得分:1)

这是一个丑陋的黑客,假设你在两个图中都有相同的刻面布局。 它取代了ggplot构建的panel元素。

p <- ggplot(mtcars, aes(mpg, wt)) + geom_point()
p1 <- p + facet_wrap(~ cyl, scales = "free_y") + labs(title = 'original')
# create "other" data.frame
n <- nrow(mtcars)
set.seed(201405)
mtcars2 <- mtcars[sample(seq_len(n ),n-15),]
# create this second plot
p2 <- p1 %+% mtcars2 + labs(title = 'new data')
# and a copy so we can attempt to fix
p3 <- p2 + labs(title = 'new data original scale')
# use ggplot_build to construct the plots for rendering
p1b <- ggplot_build(p1)
p3b <- ggplot_build(p3)
# replace the 'panel' information in plot 2 with that
# from plot 1
p3b[['panel']] <- p1b[['panel']]
# render the revised plot

# for comparison
library(gridExtra)

grid.arrange(p1 , p2, ggplot_gtable(p3b))

enter image description here