具有不同 y 轴刻度的 ggplot facet_grid:facet 面板的反向轴
ggplot facet_grid with different y axis scales: reverse axis for a facet panel
我有四个 x 轴(时间)相同但 y 轴不同的图。所以我用了
library(ggplot2)
Gio.m <- melt(Gio, id="AGE")
ggplot(Gio.m[!is.na(Gio.m$value),], aes(x=AGE, y=value, group=1))+
geom_line(aes(color=variable)) +
facet_grid(variable ~ ., scales="free_y") +
theme(legend.position="none")
用四个散点图制作一个网格。
结果如下所示:
第一个问题是如何避免输出显示所有 y-values。
第二个问题,是否有可能在网格内只转动一个地块的轴(之后应该有一个相反的y-axis)。
非常感谢您的帮助,如果我需要提供有关数据的更多信息,请告诉我。
对于你的第一个问题,正如@Roman 已经提到的,你很可能在 Gio
融化后在 value
列中有分类数据 table。要解决此问题,请将其转换回数字:
- 如果
value
是字符,则运行Gio.m$value <- as.numeric(Gio.m$value)
- 如果
value
是因数,则 运行 Gio.m$value <- as.numeric(levels(Gio.m$value))[Gio.m$value]
正如 here 所指出的
对于第二个问题 - 不确定我是否理解正确,但一种解决方案可能是:
1) 生成绘图示例及其 OY 轴反转版本:
library(ggplot2)
library(grid)
# Plot 1
p1 <- ggplot(mpg, aes(cty, displ)) + geom_point() + facet_grid(drv ~ cyl)
# Plot 2 = plot 1 with OY reversed
p2 <- p1 + scale_y_reverse()
2) 获取网格布局并识别 grobs:
# Generate the ggplot2 plot grob for each case
g1 <- ggplotGrob(p1)
g2 <- ggplotGrob(p2)
# Draw a diagram of a Grid layout; Is helpful to identifies grobs
grid.show.layout(gtable:::gtable_layout(g1))
# or reduce the font if more practical
grid.show.layout(gtable:::gtable_layout(g1), vp = viewport(gp = gpar(cex=0.7)))
# Check also the layout
g1$layout
如上所述检查和可视化布局结构有助于识别所需的 grob。在这里,我想确定顶部面板 grob 的名称,以便我将它们替换为图表中具有反向 OY 的名称。
3) 替换grobs。将图 1 (p1) 的前 3 个面板替换为 p2 中 OY 反转的面板。还需要更换轴。
# Replace the panels from g1 with the ones from g2
panels <- c('panel-1-1', 'panel-4-1', 'panel-3-2', 'panel-2-3')
for (p in panels){
g1$grobs[grep(p, g1$layout$name)] <- g2$grobs[grep(p, g2$layout$name)]
}
# Also replace the axis corresponding to those panels
g1$grobs[grep('axis-l-1', g1$layout$name)] <- g2$grobs[grep('axis-l-1', g2$layout$name)]
查看结果
p1 # the original plot
grid.newpage(); grid.draw(g1) # the edited plot with top panels having OY reversed
刚刚意识到您没有按两个变量分面,而只按一个变量分面,在这种情况下,稍微不那么复杂:
p1 <- ggplot(mpg, aes(cty, displ)) + geom_point() + facet_grid(cyl ~ ., scales="free_y")
p2 <- p1 + scale_y_reverse()
g1 <- ggplotGrob(p1)
g2 <- ggplotGrob(p2)
g1$grobs[grep("panel-1-1", g1$layout$name)] <- g2$grobs[grep("panel-1-1", g2$layout$name)]
g1$grobs[grep('axis-l-1', g1$layout$name)] <- g2$grobs[grep('axis-l-1', g2$layout$name)]
我有四个 x 轴(时间)相同但 y 轴不同的图。所以我用了
library(ggplot2)
Gio.m <- melt(Gio, id="AGE")
ggplot(Gio.m[!is.na(Gio.m$value),], aes(x=AGE, y=value, group=1))+
geom_line(aes(color=variable)) +
facet_grid(variable ~ ., scales="free_y") +
theme(legend.position="none")
用四个散点图制作一个网格。 结果如下所示:
第一个问题是如何避免输出显示所有 y-values。
第二个问题,是否有可能在网格内只转动一个地块的轴(之后应该有一个相反的y-axis)。
非常感谢您的帮助,如果我需要提供有关数据的更多信息,请告诉我。
对于你的第一个问题,正如@Roman 已经提到的,你很可能在 Gio
融化后在 value
列中有分类数据 table。要解决此问题,请将其转换回数字:
- 如果
value
是字符,则运行Gio.m$value <- as.numeric(Gio.m$value)
- 如果
value
是因数,则 运行Gio.m$value <- as.numeric(levels(Gio.m$value))[Gio.m$value]
正如 here 所指出的
对于第二个问题 - 不确定我是否理解正确,但一种解决方案可能是:
1) 生成绘图示例及其 OY 轴反转版本:
library(ggplot2)
library(grid)
# Plot 1
p1 <- ggplot(mpg, aes(cty, displ)) + geom_point() + facet_grid(drv ~ cyl)
# Plot 2 = plot 1 with OY reversed
p2 <- p1 + scale_y_reverse()
2) 获取网格布局并识别 grobs:
# Generate the ggplot2 plot grob for each case
g1 <- ggplotGrob(p1)
g2 <- ggplotGrob(p2)
# Draw a diagram of a Grid layout; Is helpful to identifies grobs
grid.show.layout(gtable:::gtable_layout(g1))
# or reduce the font if more practical
grid.show.layout(gtable:::gtable_layout(g1), vp = viewport(gp = gpar(cex=0.7)))
# Check also the layout
g1$layout
如上所述检查和可视化布局结构有助于识别所需的 grob。在这里,我想确定顶部面板 grob 的名称,以便我将它们替换为图表中具有反向 OY 的名称。
3) 替换grobs。将图 1 (p1) 的前 3 个面板替换为 p2 中 OY 反转的面板。还需要更换轴。
# Replace the panels from g1 with the ones from g2
panels <- c('panel-1-1', 'panel-4-1', 'panel-3-2', 'panel-2-3')
for (p in panels){
g1$grobs[grep(p, g1$layout$name)] <- g2$grobs[grep(p, g2$layout$name)]
}
# Also replace the axis corresponding to those panels
g1$grobs[grep('axis-l-1', g1$layout$name)] <- g2$grobs[grep('axis-l-1', g2$layout$name)]
查看结果
p1 # the original plot
grid.newpage(); grid.draw(g1) # the edited plot with top panels having OY reversed
刚刚意识到您没有按两个变量分面,而只按一个变量分面,在这种情况下,稍微不那么复杂:
p1 <- ggplot(mpg, aes(cty, displ)) + geom_point() + facet_grid(cyl ~ ., scales="free_y")
p2 <- p1 + scale_y_reverse()
g1 <- ggplotGrob(p1)
g2 <- ggplotGrob(p2)
g1$grobs[grep("panel-1-1", g1$layout$name)] <- g2$grobs[grep("panel-1-1", g2$layout$name)]
g1$grobs[grep('axis-l-1', g1$layout$name)] <- g2$grobs[grep('axis-l-1', g2$layout$name)]