一个图中的两个 ggplots,靠得很近
Two ggplots in one figure, plotted close together
我想用 geom_tile 绘制一个填充轮廓,相应的原始轨迹正下方,两者之间没有 space。使用 gridExtra 或 cowplot 时,我可以让它们靠近但不能靠近原始迹线顶部在填充轮廓的 x 轴上的位置。详情如下:
数据
library(reshape2)
library(ggplot2)
volcano=volcano
volcano3d=melt(volcano)
names(volcano3d) <- c("x", "y", "z")
地块
fill=ggplot(volcano3d,aes(x,y,z))+geom_tile(aes(fill=z))
raw=ggplot(volcano3d,aes(x,y))+geom_line()+theme(aspect.ratio=1/20)
我的尝试
library(gridExtra)
grid.arrange(fill,raw,heights=c(5,1)
虽然他们很接近,但我想做几件事:
- 向上移动底部轨迹,使底部轨迹的顶部接触等高线图的 x 轴。
- 对齐两个轴,使 0,25,50,75 全部对齐。在 cowplot 中,您可以使用对齐参数,这样很好,但我不知道如何将它们彼此靠近。
理想剧情
这来自不同的数据集,但它是布局的一个很好的例子。
想法?
除了图例位于绘图区域内外,这使您更接近您要查找的内容。我使用 theme(plot.margin) 调整绘图周围的顶部和底部间距并使轴对齐。 expand=0 允许数据扩展到绘图的边缘(如您的示例所示)。创建每个绘图的 grobs 并将宽度设置为相等允许您控制 arrangeGrob 中的高度和宽度。
library(reshape2)
library(ggplot2)
library(gridExtra)
library(grid)
volcano=volcano
volcano3d=melt(volcano)
names(volcano3d) <- c("x", "y", "z")
fill=ggplot(volcano3d,aes(x,y,z))+geom_tile(aes(fill=z)) +
theme(axis.text.x = element_blank(),
legend.position=c(1,1),
legend.justification=c(1, 1),
axis.title.x = element_blank(),axis.ticks=element_blank(),
plot.margin = unit(c(1,1,0,1), "cm")) +
scale_x_continuous(expand = c(0, 0)) +
scale_y_continuous(expand = c(0, 0))
raw=ggplot(volcano3d,aes(x,y))+geom_line()+
theme(aspect.ratio=1/20,
plot.margin = unit(c(-1.2,1,1,1), "cm")) +
scale_x_continuous(expand = c(0, 0))
gA <- ggplotGrob(fill)
gB <- ggplotGrob(raw)
gA$widths <- gB$widths
grid.newpage()
grid.draw(arrangeGrob(gA,gB, heights = c(4/5, 1/5)) )
可以将图例保留在情节之外。在两个 gtables 中,gA 有一个额外的列来获取图例。因此,向 gB 添加一列,其宽度与 gA 图例相同。
此外,我将从 gtables 中删除相关的顶部和底部边距行。
library(reshape2)
library(ggplot2)
library(gridExtra)
library(gtable)
library(grid)
volcano=volcano
volcano3d=melt(volcano)
names(volcano3d) <- c("x", "y", "z")
fill = ggplot(volcano3d, aes(x, y, z)) +
geom_tile(aes(fill=z)) +
scale_x_continuous(expand = c(0, 0)) +
scale_y_continuous(expand = c(0, 0))
raw = ggplot(volcano3d,aes(x,y)) +
geom_line() +
scale_x_continuous(expand = c(0, 0))
gA <- ggplotGrob(fill)
gB <- ggplotGrob(raw)
ga = gA[-c(10:7), ] # Remove bottom rows from gA
gb = gB[-c(1:5), ] # Remove top rows from gB
# Add extra column to gB gtable
gb = gtable_add_cols(gb, ga$widths[7:8], 6)
ga$widths <- gb$widths
grid.newpage()
grid.draw(arrangeGrob(ga,gb, heights = c(4/5, 1/5)) )
我想用 geom_tile 绘制一个填充轮廓,相应的原始轨迹正下方,两者之间没有 space。使用 gridExtra 或 cowplot 时,我可以让它们靠近但不能靠近原始迹线顶部在填充轮廓的 x 轴上的位置。详情如下:
数据
library(reshape2)
library(ggplot2)
volcano=volcano
volcano3d=melt(volcano)
names(volcano3d) <- c("x", "y", "z")
地块
fill=ggplot(volcano3d,aes(x,y,z))+geom_tile(aes(fill=z))
raw=ggplot(volcano3d,aes(x,y))+geom_line()+theme(aspect.ratio=1/20)
我的尝试
library(gridExtra)
grid.arrange(fill,raw,heights=c(5,1)
虽然他们很接近,但我想做几件事:
- 向上移动底部轨迹,使底部轨迹的顶部接触等高线图的 x 轴。
- 对齐两个轴,使 0,25,50,75 全部对齐。在 cowplot 中,您可以使用对齐参数,这样很好,但我不知道如何将它们彼此靠近。
理想剧情
这来自不同的数据集,但它是布局的一个很好的例子。
想法?
除了图例位于绘图区域内外,这使您更接近您要查找的内容。我使用 theme(plot.margin) 调整绘图周围的顶部和底部间距并使轴对齐。 expand=0 允许数据扩展到绘图的边缘(如您的示例所示)。创建每个绘图的 grobs 并将宽度设置为相等允许您控制 arrangeGrob 中的高度和宽度。
library(reshape2)
library(ggplot2)
library(gridExtra)
library(grid)
volcano=volcano
volcano3d=melt(volcano)
names(volcano3d) <- c("x", "y", "z")
fill=ggplot(volcano3d,aes(x,y,z))+geom_tile(aes(fill=z)) +
theme(axis.text.x = element_blank(),
legend.position=c(1,1),
legend.justification=c(1, 1),
axis.title.x = element_blank(),axis.ticks=element_blank(),
plot.margin = unit(c(1,1,0,1), "cm")) +
scale_x_continuous(expand = c(0, 0)) +
scale_y_continuous(expand = c(0, 0))
raw=ggplot(volcano3d,aes(x,y))+geom_line()+
theme(aspect.ratio=1/20,
plot.margin = unit(c(-1.2,1,1,1), "cm")) +
scale_x_continuous(expand = c(0, 0))
gA <- ggplotGrob(fill)
gB <- ggplotGrob(raw)
gA$widths <- gB$widths
grid.newpage()
grid.draw(arrangeGrob(gA,gB, heights = c(4/5, 1/5)) )
可以将图例保留在情节之外。在两个 gtables 中,gA 有一个额外的列来获取图例。因此,向 gB 添加一列,其宽度与 gA 图例相同。
此外,我将从 gtables 中删除相关的顶部和底部边距行。
library(reshape2)
library(ggplot2)
library(gridExtra)
library(gtable)
library(grid)
volcano=volcano
volcano3d=melt(volcano)
names(volcano3d) <- c("x", "y", "z")
fill = ggplot(volcano3d, aes(x, y, z)) +
geom_tile(aes(fill=z)) +
scale_x_continuous(expand = c(0, 0)) +
scale_y_continuous(expand = c(0, 0))
raw = ggplot(volcano3d,aes(x,y)) +
geom_line() +
scale_x_continuous(expand = c(0, 0))
gA <- ggplotGrob(fill)
gB <- ggplotGrob(raw)
ga = gA[-c(10:7), ] # Remove bottom rows from gA
gb = gB[-c(1:5), ] # Remove top rows from gB
# Add extra column to gB gtable
gb = gtable_add_cols(gb, ga$widths[7:8], 6)
ga$widths <- gb$widths
grid.newpage()
grid.draw(arrangeGrob(ga,gb, heights = c(4/5, 1/5)) )