R 使用ggplot2以粗体突出显示各个轴标签

R 使用ggplot2以粗体突出显示各个轴标签,r,indexing,ggplot2,R,Indexing,Ggplot2,我想用粗体突出显示各个轴标签。@MrFlick知道这一点,但我不知道如何对多个项目执行此操作a),以及b)是否可以使用标签的名称而不是列表(或表达式)中的项目编号 以下是一个示例数据集: 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),

我想用粗体突出显示各个轴标签。@MrFlick知道这一点,但我不知道如何对多个项目执行此操作a),以及b)是否可以使用标签的名称而不是列表(或表达式)中的项目编号

以下是一个示例数据集:

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))
require(ggplot2)
需要(dplyr)
种子(36)
xx%
排列(-VALUE)%%>%select(CLONE)%%>%unlist()
xx%突变(克隆=因子(克隆,级别=克隆顺序))
ggplot(xx,aes(x=克隆,y=值,fill=年份))+
几何图形栏(stat=“identity”,position=“dodge”)+
小平面包裹(~TREAT)


现在我想用粗体
克隆
A
B
E
。我相信这会起作用,但我不知道怎么做。理想情况下,最好知道如何使用列表/表达式中的项目编号,以及使用标签,例如
a
b和
e
e

我不确定是否可以按名称映射标签特征,但通过调用
theme
,完全可以按位置进行操作:

ggplot(xx, aes(x=CLONE, y=VALUE, fill=YEAR)) + 
  geom_bar(stat="identity", position="dodge") +
  facet_wrap(~TREAT) +
  theme(axis.text.x = element_text(face = c('bold', 'bold', 'plain', 'plain', 'bold')))
请注意,
axis.text.x
列出的字体面与x轴标签的长度相同(五个元素)。这将产生:


您可以在
缩放x_离散
中创建表达式的命名向量(将文本变为粗体),并使用
parse=TRUE
计算表达式:

ggplot(xx, aes(x=CLONE, y=VALUE, fill=YEAR)) + 
    geom_bar(stat="identity", position="dodge") +
    facet_wrap(~TREAT) +
    scale_x_discrete(labels=c("A"=expression(bold(A)), "C"=expression(bold(C)),
                              "E"=expression(bold(E)), parse=TRUE))
您可能可以通过编程方式创建表达式的向量,而不是将其键入出来,但实现这一点的方法就是现在就避开我


以下是创建壮胆载体的一般方法:

colorado <- function(src, boulder) {
  if (!is.factor(src)) src <- factor(src)                   # make sure it's a factor
  src_levels <- levels(src)                                 # retrieve the levels in their order
  brave <- boulder %in% src_levels                          # make sure everything we want to make bold is actually in the factor levels
  if (all(brave)) {                                         # if so
    b_pos <- purrr::map_int(boulder, ~which(.==src_levels)) # then find out where they are
    b_vec <- rep("plain", length(src_levels))               # make'm all plain first
    b_vec[b_pos] <- "bold"                                  # make our targets bold
    b_vec                                                   # return the new vector
  } else {
    stop("All elements of 'boulder' must be in src")
  }
}

ggplot(xx, aes(x=CLONE, y=VALUE, fill=YEAR)) + 
  geom_bar(stat="identity", position="dodge") +
  facet_wrap(~TREAT) +
  theme(axis.text.x=element_text(face=colorado(xx$CLONE, c("A", "B", "E"))))

谢谢!使用
axis.text.x
绝对是一个选项,但有点麻烦,因为我有34个因子级别。这就是为什么我希望以某种方式只是通过名字而不是通过计算位置来指定那些我想要加粗的。我对你的答案投了赞成票,但我想再保留一段时间。也许有人有不同的想法。再多玩一点,它看起来像
element\u text
只按位置工作,而忽略命名。减少键入的一个选项是明智地使用
rep
,例如:
c(rep('plain',10),rep(c('bold','plain',each=2))
将使前10个标签变为普通,下2个标签变为粗体,下2个标签变为普通。这正是我所需要的,谢谢@jdobres!我使用了一个逻辑向量来创建我的“脸”vector.Wow,太棒了!谢谢!还有一个问题,除了加粗外,是否还可以在
axis.text.x
中使用
size=
增加加粗标签的字体大小,例如2pt?是的,大部分
element\u text()
参数是矢量化的,但您需要复制并调整此函数,使其成为
大小
变换器和
变换器。尝试将其调整为可选的顶部或底部对齐所选标签。我编写了代码,但它只生成一个空白绘图。将“普通”替换为1.0和“粗体”在你的
colorado'函数中使用0.0,在plot调用中使用:
theme(axis.text.x=element\u text(vjust=colorado2(xx$CLONE,c(“A”、“B”、“E”))“。但是更改占据了绘图的一半,这是我不想要的。有什么想法如何在绘图的标签区域内缩放0或1@hrbrmstr?定义一个新问题任何用户@user2498193ok没问题@hrbrmstr-新问题出现了:如果您有时间,感谢您的帮助!谢谢@eipi10!我也喜欢这个问题,因为它很简单(即upvote).但是@hrbrmstr的答案让我有了更多的控制权。是的,我也喜欢他的答案。
colorado <- function(src, boulder) {
  if (!is.factor(src)) src <- factor(src)                   # make sure it's a factor
  src_levels <- levels(src)                                 # retrieve the levels in their order
  brave <- boulder %in% src_levels                          # make sure everything we want to make bold is actually in the factor levels
  if (all(brave)) {                                         # if so
    b_pos <- purrr::map_int(boulder, ~which(.==src_levels)) # then find out where they are
    b_vec <- rep("plain", length(src_levels))               # make'm all plain first
    b_vec[b_pos] <- "bold"                                  # make our targets bold
    b_vec                                                   # return the new vector
  } else {
    stop("All elements of 'boulder' must be in src")
  }
}

ggplot(xx, aes(x=CLONE, y=VALUE, fill=YEAR)) + 
  geom_bar(stat="identity", position="dodge") +
  facet_wrap(~TREAT) +
  theme(axis.text.x=element_text(face=colorado(xx$CLONE, c("A", "B", "E"))))