根据该问题和解决方案改编的问题:Highlighting individual axis labels in bold using ggplot2

我想根据是否满足条件来有选择地调整水平轴标签。因此,从上述问答中借用我建立了一个示例:

require(ggplot2)
require(dplyr)
set.seed(36)
xx<-data.frame(YEAR=rep(c("X", "Y"), each=20),
           CLONE=rep(c("A", "B", "C", "D", "E"), each=4, 2),
           TREAT=rep(c("T1", "T2", "T3", "C"), 10),
           VALUE=sample(c(1:10), 40, replace=T))

# Simple plot with factors on y axis
ggplot(xx, aes(x = VALUE, y=CLONE, fill=YEAR)) +
    geom_bar(stat="identity", position="dodge") +
    facet_wrap(~TREAT)


r - 使用ggplot2用粗体对齐单个轴标签-LMLPHP

好的,所以我从上面的问题+答案中采用了函数来生成证明的向量:

# Modify to control justification
colorado2 <- function(src, boulder) {
    if (!is.factor(src)) src <- factor(src)
    src_levels <- levels(src)
    brave <- boulder %in% src_levels
    if (all(brave)) {
        b_pos <- purrr::map_int(boulder, ~which(.==src_levels))
        b_vec <- rep(0.2, length(src_levels))
        b_vec[b_pos] <- 0.9
        b_vec
    } else {
        stop("All elements of 'boulder' must be in src")
    }
}

# Redraw the plot with modifcation
ggplot(xx, aes(x = VALUE, y=CLONE, fill=YEAR)) +
    geom_bar(stat="identity", position="dodge") +
    facet_wrap(~TREAT) +
    theme(axis.text.y=element_text(hjust=colorado2(xx$CLONE, c("A", "B", "E"))))


我得到了这个不幸的烂摊子:
r - 使用ggplot2用粗体对齐单个轴标签-LMLPHP

标签在我想要的方向上是合理的-但由于我无法弄清的原因,占用了太多的地块。我该如何解决 ?

最佳答案

我做了一些挖掘。问题在于ggplot如何设置y轴grob的grob宽度。假定所有标签上的hjust相同。我们可以通过破解grob树来解决此问题。以下代码已在ggplot2的开发版本中进行了测试,可能无法与当前发布的版本一起使用。

首先,一个简单的可复制示例:

p <- ggplot(mpg, aes(manufacturer, hwy)) + geom_boxplot() + coord_flip() +
  theme(axis.text.y = element_text(hjust = c(rep(1, 10), rep(0, 5))))
p # doesn't work


r - 使用ggplot2用粗体对齐单个轴标签-LMLPHP

问题在于,轴grob的grob宽度被设置为整个绘图区域。但是我们可以手动输入并固定宽度。不幸的是,我们必须在多个位置修复它:

# get a vector of the y labels as strings
ylabels <- as.character(unique(mpg$manufacturer))

library(grid)
g <- ggplotGrob(p)

# we need to fix the grob widths at various locations in the grob tree
g$grobs[[3]]$children[[2]]$widths[1] <- max(stringWidth(ylabels))
g$grobs[[3]]$width <- sum(grobWidth(g$grobs[[3]]$children[[1]]), grobWidth(g$grobs[[3]]$children[[2]]))
g$widths[3] <- g$grobs[[3]]$width

# draw the plot
grid.newpage()
grid.draw(g)


r - 使用ggplot2用粗体对齐单个轴标签-LMLPHP

ggplot2的轴绘制代码可能像我一开始那样就可以修改以计算宽度,然后问题就消失了。

07-24 09:44