我有数据随着时间的推移绘制四个不同的变量。我想使用facet_grid将它们组合在一个图中,其中每个变量都有自己的子图。以下代码类似于我的数据和我呈现它的方式:
require(ggplot2)
require(reshape2)
subm <- melt(economics, id='date', c('psavert','uempmed','unemploy'))
mcsm <- melt(data.frame(date=economics$date, q=quarters(economics$date)), id='date')
mcsm$value <- factor(mcsm$value)
ggplot(subm, aes(date, value, col=variable, group=1)) + geom_line() +
facet_grid(variable~., scale='free_y') +
geom_step(data=mcsm, aes(date, value)) +
scale_y_discrete(breaks=levels(mcsm$value))
如果我遗漏了scale_y_discrete,R抱怨我正在尝试将离散值与连续比例相结合。如果我包括scale_y_discreate,我的连续系列会错过它们的比例。
有没有解决这个问题的巧妙方法,即。让所有秤都正确吗?我还看到图例按字母顺序排序,我可以更改它,以便图例的顺序与子图的顺序相同吗?
答案 0 :(得分:7)
您的数据存在的问题是,数据框subm
value
的数字是数字(连续),但mcsm
value
是因素(离散)。您不能对数值和连续值使用相同的比例,并且只能获得最后一个面(离散)的y值。此外,在一个图中也不可能使用两个scale_y...()
函数。
我的方法是将mcsm
value
设为数字(保存为value2
),然后使用它们 - 它会将季度绘制为1,2,3和4。传奇问题,请使用scale_color_discrete()
并按照您的需要提供breaks=
。
mcsm$value2<-as.numeric(mcsm$value)
ggplot(subm, aes(date, value, col=variable, group=1)) + geom_line()+
facet_grid(variable~., scale='free_y') + geom_step(data=mcsm, aes(date, value2)) +
scale_color_discrete(breaks=c('psavert','uempmed','unemploy','q'))
另一种方法是使用grobs和库gridExtra
将您的数据绘制为单独的图。
首先,将包含所有图例和数据(代码如上)的图保存为对象p
。然后使用函数ggplot_build()
和ggplot_gtable()
将绘图保存为grob对象gp
。仅从gp中提取绘制图例的部分(保存为对象gp.leg
) - 在这种情况下是列表元素编号17.
library(gridExtra)
p<-ggplot(subm, aes(date, value, col=variable, group=1)) + geom_line()+
facet_grid(variable~., scale='free_y') + geom_step(data=mcsm, aes(date, value2)) +
scale_color_discrete(breaks=c('psavert','uempmed','unemploy','q'))
gp<-ggplot_gtable(ggplot_build(p))
gp.leg<-gp$grobs[[17]]
制作两个新的地块p1
和p2
- 首先绘制subm
的数据和mcsm
的仅次数据。使用scale_color_manual()
设置与用于绘图p
的颜色相同的颜色。对于第一个图,删除x轴标题,文本和刻度,并使用plot.margin=
将下边距设置为负数。对于第二个图,将上边距更改为负数。两块地块都应使用faced_grid()
来获得分面外观。
p1 <- ggplot(subm, aes(date, value, col=variable, group=1)) + geom_line()+
facet_grid(variable~., scale='free_y')+
theme(plot.margin = unit(c(0.5,0.5,-0.25,0.5), "lines"),
axis.text.x=element_blank(),
axis.title.x=element_blank(),
axis.ticks.x=element_blank())+
scale_color_manual(values=c("#F8766D","#00BFC4","#C77CFF"),guide="none")
p2 <- ggplot(data=mcsm, aes(date, value,group=1,col=variable)) + geom_step() +
facet_grid(variable~., scale='free_y')+
theme(plot.margin = unit(c(-0.25,0.5,0.5,0.5), "lines"))+ylab("")+
scale_color_manual(values="#7CAE00",guide="none")
将两个图p1
和p2
保存为grob对象,然后为两个图设置相同的宽度。
gp1 <- ggplot_gtable(ggplot_build(p1))
gp2 <- ggplot_gtable(ggplot_build(p2))
maxWidth = grid::unit.pmax(gp1$widths[2:3],gp2$widths[2:3])
gp1$widths[2:3] <- as.list(maxWidth)
gp2$widths[2:3] <- as.list(maxWidth)
使用函数grid.arrange()
和arrangeGrob()
在一个图中排列图表和图例。
grid.arrange(arrangeGrob(arrangeGrob(gp1,gp2,heights=c(3/4,1/4),ncol=1),
gp.leg,widths=c(7/8,1/8),ncol=2))