左调整 (hjust = 0) 垂直 x 轴标签在具有自由比例的小平面上

Tje*_*ebo 5 r ggplot2

我决定重新表述这个问题。(编辑会花费更多时间,在我看来也不会帮助 OP。)

一个人如何左调整(hjust = 0,即在文本方向上),何时scale = 'free_x'

我真的不认为 x 标签的左调整是一件非常必要的事情(长标签通常难以阅读,右调整可能是更好的选择) - 但我发现这个问题足够有趣。

我尝试使用空填充到最大字符长度,但这不会导致所有字符串的长度相同。此外,设置axis.text.x = element.text(margin = margin())也无济于事。不用说,hjust = 0这无济于事,因为它正在每个方面进行调整。

library(ggplot2)

diamonds$cut_label <- paste("Super Dee-Duper", as.character(diamonds$cut))

ggplot(data = diamonds, aes(cut_label, carat)) +
  facet_grid(~ cut, scales = "free_x") +
  theme(axis.text.x = element_text(angle = 90))
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

红色箭头和虚线表示标签应如何调整。hjust = 0margins或空填充不会导致在所有方面调整这些标签。

这个著名问题的数据修改

Edw*_*ard 5

我尝试使用空填充到最大字符长度,但这不会导致所有字符串的长度相同。

这引起了我的注意。实际上,如果您用空格填充标签,使它们的长度相同,并确保字体系列的间距不成比例,则会导致所有字符串的长度相同。

首先,用空格填充标签,使所有标签具有相同的长度。我将str_pad使用stringr包中的函数。

library(ggplot2)

data("diamonds")

diamonds$cut_label <- paste("Super Dee-Duper", as.character(diamonds$cut))

library(stringr)
diamonds$cut_label <- str_pad(diamonds$cut_label, side="right",
                              width=max(nchar(diamonds$cut_label)), pad=" ")
Run Code Online (Sandbox Code Playgroud)

然后,您可能需要使用extrafont包加载非按比例间隔的字体。

library(extrafont)
font_import(pattern='consola')  # Or any other of your choice.
Run Code Online (Sandbox Code Playgroud)

然后,运行 ggplot 命令并使用family参数指定按比例间隔的字体。

ggplot(data = diamonds, aes(cut_label, carat)) +
  facet_grid(~cut, scales = "free_x") +
  theme(axis.text.x = element_text(angle = 90, family="Consolas"))
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

  • 塔。...我已经更新了答案。希望看到另一种基于访问网格的解决方案。 (2认同)

dww*_*dww 2

我们可以在生成绘图后使用 编辑文本块library(grid)

g <- ggplot(data = diamonds, aes(cut_label, carat)) +
  facet_grid(~cut, scales = "free_x") +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5))

gt <- cowplot::as_gtable(g)
axis_grobs <- which(grepl("axis-b", gt$layout$name))
labs <- levels(factor(diamonds$cut_label))[order(levels(diamonds$cut))]

for (i in seq_along(axis_grobs)) {
  gt$grobs[axis_grobs[i]][[1]] <-
    textGrob(labs[i], y = unit(0, "npc"), just = "left", rot = 90, gp = gpar(fontsize = 9))
}

grid.draw(gt)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述