我决定重新表述这个问题。(编辑会花费更多时间,在我看来也不会帮助 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 = 0或margins或空填充不会导致在所有方面调整这些标签。
我尝试使用空填充到最大字符长度,但这不会导致所有字符串的长度相同。
这引起了我的注意。实际上,如果您用空格填充标签,使它们的长度相同,并确保字体系列的间距不成比例,则会导致所有字符串的长度相同。
首先,用空格填充标签,使所有标签具有相同的长度。我将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)
我们可以在生成绘图后使用 编辑文本块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)
| 归档时间: |
|
| 查看次数: |
604 次 |
| 最近记录: |