2

我想创建facet_grid/facet_wrap绘图,x 轴在每个图表下重复,但刻度仅出现在最低图表上。

这是一个 x 轴仅出现一次的绘图示例facet_grid

ggplot(mtcars, aes(y=mpg,x=cyl)) + 
  facet_grid(am~., scales="free") + 
  geom_point() + 
  theme_classic() + 
  theme(strip.background = element_rect(colour="white", fill="white"),
        strip.text.y = element_blank())

在此处输入图像描述

这是一个 x 轴出现两次但两次都使用刻度的绘图示例facet_wrap

ggplot(mtcars, aes(y=mpg, x=cyl)) + 
  facet_wrap(~am, ncol=1, scales="free") + 
  geom_point() + 
  theme_classic() + 
  theme(strip.background = element_rect(colour="white", fill="white"),
        strip.text.x = element_blank())

在此处输入图像描述

我想要与上图相同的图,但在上图的 x 轴上没有刻度。或者,如果您愿意,我想要与第一个相同的图,但在上图中有一个 x 轴。

4

2 回答 2

3

这是一个非常冗长的解决方案,但我认为您无法仅使用常用ggplot功能获得所需的情节。

library(ggplot2)
library(grid)

Plot <- ggplot(mtcars, aes(y=mpg, x=cyl)) + 
  facet_wrap(~am, ncol=1, scales="free") + 
  geom_point() + 
  theme_classic() + 
  theme(strip.background = element_rect(colour="white", fill="white"),
        strip.text.x = element_blank())

关闭顶部 x 轴需要修改绘图的 gtable 对象。

Plot.build <- ggplot_gtable(ggplot_build(Plot))
axis.pos <- grep("axis-b-1-1", Plot.build$layout$name)
num.ticks <- length(Plot.build$grobs[[axis.pos]]$children[2]$axis$grobs[[1]]$y)

此步骤删除轴标签:

Plot.build$grobs[[axis.pos]]$children$axis$grobs[[2]]$children[[1]]$label <- rep("", num.ticks)

此步骤删除刻度线:

Plot.build$grobs[[axes.pos]]$children[2]$axis$grobs[[1]]$y <- rep(unit(0, units="cm"), num.ticks)

最后,使用以下方法生成图:

grid.draw(Plot.build)

在此处输入图像描述

于 2018-01-12T18:56:22.963 回答
1

我用来获得一条轴线(没有刻度线)的解决方法是用来geom_hline()伪造一个轴。

#make a dataframe with the y minimum for each facet
fake.axes <- data.frame(mpg = c(10, 15), #y minimum to use for axis location
                    am = c(0,1)) #facetting variable

#add an "axis" without ticks to upper graph using geom_hline()
ggplot(mtcars, aes(y=mpg,x=cyl)) + 
  facet_grid(am~., scales="free") + 
  geom_point() + 
  geom_hline(aes(yintercept = mpg), fake.axes, #dataframe with fake axes 
         linetype = c("solid", "blank")) + #line for top graph, blank for bottom graph
  theme_classic() + 
  theme(strip.background = element_rect(colour="white", fill="white"),
        strip.text.y = element_blank())

在此处输入图像描述
如果您没有使用scales = "free",并且所有轴都在同一个位置,这更简单,您可以跳过为每个方面制作一个带有 yintercepts 的数据框,只需将 geom_hline(yintercept = 10)(或任何最小值)添加到您的绘图代码中以添加一个轴每个面都有线。

于 2018-01-12T17:26:22.150 回答