gpt4 book ai didi

r - 使用 facet 在 ggplot 中绘制连续和离散系列

转载 作者:行者123 更新时间:2023-12-04 17:51:10 25 4
gpt4 key购买 nike

我有随时间绘制四个不同变量的数据。我想使用 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 我的连续系列会错过他们的规模。

有没有什么巧妙的方法来解决这个问题,即。得到所有的尺度正确吗?我还看到图例是按字母顺序排序的,我可以更改它以便图例的排序顺序与子图相同吗?

最佳答案

您的数据问题在于数据框 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'))

enter image description here

更新 - 使用 grobs 的解决方案

另一种方法是使用 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]]

制作两个新剧情 p1p2 - 首先绘制 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")

保存两个图 p1p2作为 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))

enter image description here

关于r - 使用 facet 在 ggplot 中绘制连续和离散系列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15999304/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com