ggplot2 Facet_wrap 带有自定义 x 轴标签的图表?
ggplot2 Facet_wrap graph with custom x-axis labels?
我有一个 ggplot2 对象使用 facet_wrap 在一张图像中制作 26 个单独的直方图,但我想为每个图形分配单独的 x 标签( 数字 在每个轴上都很好,我只想在每个图下面放一些自定义文本)。我上下搜索 google 和 Whosebug 试图找到一个无济于事的答案。
不是你想要的,但是我能想到的最好的解决方案
library(ggplot2)
mtcars %>%
ggplot(aes(drat,hp))+
geom_point()+
facet_wrap(~gear,strip.position = "bottom")+
theme_dark()
有几种方法可以做到这一点...但是 none 就像您可能期望的那样非常直接。我假设您想用新标题替换 默认的 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()
)
这里我们做几件事:
- 删除坐标轴标题
- 将条形文本位置移至底部,并且
- 通过删除周围的矩形并确保将其放置在轴刻度下方的绘图区域“外部”,将条带文本格式化为看起来像轴标题
使用 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()
做到这一点并制作一些 grob,但我认为将它们作为文本 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)
)
这里我们要做几件事:
- 创建数据框来存储我们的轴标题
- 删除默认轴标题
- 添加链接到新数据框的
geom_text()
并修改位置。请注意,我在数学上将位置固定在 x 轴的“中间”。我手动放置了 y 值,但如果你愿意,你也可以在那里使用方程式。
- 转
clip="off"
。这很重要,因为使用 clip="on"
它将阻止显示任何位于面板区域之外的几何图形。
- 将图边距向下扩展一点,以便我们可以真正看到我们的文字。
我有一个 ggplot2 对象使用 facet_wrap 在一张图像中制作 26 个单独的直方图,但我想为每个图形分配单独的 x 标签( 数字 在每个轴上都很好,我只想在每个图下面放一些自定义文本)。我上下搜索 google 和 Whosebug 试图找到一个无济于事的答案。
不是你想要的,但是我能想到的最好的解决方案
library(ggplot2)
mtcars %>%
ggplot(aes(drat,hp))+
geom_point()+
facet_wrap(~gear,strip.position = "bottom")+
theme_dark()
有几种方法可以做到这一点...但是 none 就像您可能期望的那样非常直接。我假设您想用新标题替换 默认的 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()
)
这里我们做几件事:
- 删除坐标轴标题
- 将条形文本位置移至底部,并且
- 通过删除周围的矩形并确保将其放置在轴刻度下方的绘图区域“外部”,将条带文本格式化为看起来像轴标题
使用 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()
做到这一点并制作一些 grob,但我认为将它们作为文本 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)
)
这里我们要做几件事:
- 创建数据框来存储我们的轴标题
- 删除默认轴标题
- 添加链接到新数据框的
geom_text()
并修改位置。请注意,我在数学上将位置固定在 x 轴的“中间”。我手动放置了 y 值,但如果你愿意,你也可以在那里使用方程式。 - 转
clip="off"
。这很重要,因为使用clip="on"
它将阻止显示任何位于面板区域之外的几何图形。 - 将图边距向下扩展一点,以便我们可以真正看到我们的文字。