【问题标题】:ggplot2 Facet_wrap graph with custom x-axis labels?带有自定义x轴标签的ggplot2 Facet_wrap图?
【发布时间】:2021-09-15 20:14:43
【问题描述】:

我有一个 ggplot2 对象,它使用 facet_wrap 在一张图像中制作 26 个单独的直方图,但我想为每个图分配单独的 x 标签(每个轴上的 数字 都可以,我只想在每个图下方放置一些自定义文本)。我在google和stackoverflow上下搜索,试图找到一个无济于事的答案。

【问题讨论】:

  • 请提供足够的代码,以便其他人更好地理解或重现问题。

标签: r ggplot2 axis-labels facet-wrap


【解决方案1】:

有几种方法可以做到这一点...但没有一种方法像您可能期望的那样非常直接。我假设您想用新标题替换默认的 x 轴标题,所以我们将从那里开始。这是来自iris 数据集的示例:

library(ggplot2)

p <- ggplot(iris, aes(Sepal.Length, Sepal.Width)) +
  geom_point() +
  facet_wrap(~Species)

使用带状文字放置

创建特定于每个轴标题的一种方法是使用条形文本(也称为分面标签)。想法是将条形文本放置在构面的底部(通常默认情况下位于顶部)并弄乱格式。

ggplot(iris, aes(Sepal.Length, Sepal.Width)) +
  geom_point() +
  labs(x=NULL) +    # remove axis title
  facet_wrap(
    ~Species,
    strip.position = "bottom") +  # move strip position
  theme(
    strip.placement = "outside",   # format to look like title
    strip.background = element_blank()
  )

这里我们做了几件事:

  1. 移除坐标轴标题
  2. 将条形文字位置移到底部,并且
  3. 通过移除周围的矩形并确保将其放置在轴刻度下方的绘图区域“外部”,将条形文本格式化为轴标题

使用 Facet 标签制作您自己的标签

如果做我们上面所做的...但是制作自己的标签呢?您可以通过设置命名矢量as.labeller() 来调整条形文本标签(构面标签)。否则,它与上面的更改相同。这是一个例子:

my_strip_labels <- as_labeller(c(
  "setosa" = "My Setosa",
  "versicolor" = "Your versicolor",
  "virginica" = "Some other stuff"
))

ggplot(iris, aes(Sepal.Length, Sepal.Width)) +
  geom_point() +
  labs(x=NULL) +
  facet_wrap(
    ~Species, labeller = my_strip_labels,  # add labels
    strip.position = "bottom") +
  theme(
    strip.placement = "outside",
    strip.background = element_blank()
  )

保留构面标签

如果您想保留分面标签,并且只需在每个分面下方添加一个轴标题,该怎么办?好吧,也许你可以通过annotation_custom() 做到这一点并制作一些 grobs,但我认为将它们作为文本 geom 放置可能更容易。为此,您的想法是在绘图区域之外添加一个文本 geom ,并将标签文本本身映射到构面。您需要使用单独的数据框(以避免过度标记)来执行此操作,并且数据框需要包含两列:一列与分面列的标签相同,另一列用于存储我们喜欢的轴标题文本。

以下是可行的方法:

axis_titles <- data.frame(
  Species = c("setosa", "versicolor", "virginica"),
  axis_title = c("Setosa's Axis", "Versi's Axis", "Virgin's Axis")
)

p + labs(x=NULL) +
  geom_text(
    data=axis_titles,
    aes(label=axis_title), hjust=0.5,
    x=min(iris$Sepal.Length) + diff(range(iris$Sepal.Length))/2,
    y=1.7, color='red', fontface='bold'
  ) +
  coord_cartesian(clip="off") +
  theme(
    plot.margin= margin(b=30)
  )

这里我们要做一些事情:

  1. 创建数据框来存储我们的轴标题
  2. 删除默认轴标题
  3. 添加链接到新数据框的geom_text() 并修改放置。请注意,我在数学上将位置固定为 x 轴的“中间”。我手动放置了 y 值,但如果需要,您也可以在那里使用方程式。
  4. clip="off"。这一点很重要,因为clip="on" 会阻止显示任何几何图形(如果它们位于面板区域之外)。
  5. 将绘图边距向下扩展一点,以便我们可以真正看到我们的文本。

【讨论】:

  • 很好的答案(+1)!只是想稍微说明一下,对于您的最后一个示例,使用 y=-Inf 和使用 vjust = 3.5(或附近)只是稍微简化了具有不同 y 轴下限的任何其他数据集的任务。
【解决方案2】:

不是你想要的,而是我能想到的最好的解决方案

library(ggplot2)

mtcars %>% 
  ggplot(aes(drat,hp))+
  geom_point()+
  facet_wrap(~gear,strip.position = "bottom")+
  theme_dark()

【讨论】:

    猜你喜欢
    • 2017-04-02
    • 1970-01-01
    • 2014-10-02
    • 1970-01-01
    • 1970-01-01
    • 2015-09-22
    • 2010-12-04
    • 1970-01-01
    • 2016-10-06
    相关资源
    最近更新 更多