使用 ggplot2 在 R 中创建具有嵌套小图的折线图
使用 ggplot2 创建具有嵌套小图的折线图
本教程演示如何使用 ggplot2 包在 R 中创建具有嵌套小图的折线图。主图以 Date 为横坐标,Flux 为纵坐标,Gas 为分面,颜色为 Hybrid 的折线图。每个分面图右上角四分之一的地方添加对应的小折线图,小折线图使用 df2 的数据做一样的折线图。
示例数据:
假设有两个数据框 df1 和 df2,均含有 Gas, Date, Flux, Hybrid 和 Nrate 等指标(两个数据框的行数差距很大)。
代码:
library(ggplot2)
# 读取数据
df1 <- read.csv('df1.csv')
df2 <- read.csv('df2.csv')
# 绘制主图
ggplot(df1, aes(x = Date, y = Flux, color = Hybrid)) +
geom_line() +
facet_wrap(~Gas, scales = 'free_y') +
theme_bw() +
labs(x = 'Date', y = 'Flux') +
theme(legend.position = 'bottom')
# 添加小折线图
for (i in unique(df1$Gas)) {
p <- ggplot(df2[df2$Gas == i,], aes(x = Date, y = Flux)) +
geom_line(color = 'grey') +
theme_bw() +
labs(x = NULL, y = NULL) +
theme(
axis.line = element_blank(),
axis.text = element_blank(),
axis.title = element_blank(),
panel.grid = element_blank(),
panel.border = element_blank(),
panel.background = element_blank(),
legend.position = 'none'
)
g <- ggplot_gtable(ggplot_build(p))
gg <- ggplot_gtable(ggplot_build(p))
pp <- c(subset(gg$layout, name == 'panel', se = t:r))
g <- gtable_add_grob(g, gg$grobs[[which(gg$layout$name == 'panel')]], pp$t, pp$l, pp$b, pp$l)
pp <- c(subset(gg$layout, name == 'ylab', se = b:r))
g <- gtable_add_grob(g, gg$grobs[[which(gg$layout$name == 'ylab')]], pp$t, pp$l, pp$b, pp$l)
pp <- c(subset(gg$layout, name == 'title', se = b:r))
g <- gtable_add_grob(g, gg$grobs[[which(gg$layout$name == 'title')]], pp$t, pp$l, pp$b, pp$l)
pp <- c(subset(gg$layout, name == 'xlab', se = t:r))
g <- gtable_add_grob(g, gg$grobs[[which(gg$layout$name == 'xlab')]], pp$t, pp$l, pp$b, pp$l)
pp <- c(subset(gg$layout, name == 'legend', se = b:r))
g <- gtable_add_grob(g, gg$grobs[[which(gg$layout$name == 'legend')]], pp$t, pp$l, pp$b, pp$l)
g$widths <- gg$widths[gg$layout$name == 'panel']
g$heights <- gg$heights[gg$layout$name == 'panel']
grid.arrange(ggplotify::as.grob(g), ncol = length(unique(df1$Gas)), widths = unit(rep(1, length(unique(df1$Gas))), 'null'))
}
解释:
- 使用
ggplot()函数创建主图,将Date设置为横坐标,Flux设置为纵坐标,Hybrid设置为颜色,并使用facet_wrap()函数将Gas设置为分面。 - 使用循环遍历
df1中的每个Gas,并使用df2的数据创建对应的小折线图。 - 使用
ggplot_gtable()函数将小折线图转换为gtable对象,并使用gtable_add_grob()函数将小折线图添加到主图的右上角。 - 使用
grid.arrange()函数将所有分面图排列在一起。
注意:
- 确保
df1和df2中的Date列格式一致。 - 可以根据需要调整小折线图的大小和位置。
- 可以使用不同的颜色和样式来区分主图和小折线图。
本教程展示了如何使用 ggplot2 创建具有嵌套小图的折线图。这可以用于更详细地展示数据,并突出显示不同组之间的关系。
原文地址: https://www.cveoy.top/t/topic/mtN9 著作权归作者所有。请勿转载和采集!