【问题标题】:Dynamically formatting individual axis labels in ggplot2动态格式化ggplot2中的单个轴标签
【发布时间】:2015-05-04 17:14:41
【问题描述】:

这可能最终成为expressioncall 问题,但我正在尝试有条件地格式化单个轴标签。

在以下示例中,我想有选择地将其中一个轴标签加粗:

library(ggplot2)

data <- data.frame(labs = c("Oranges", "Apples", "Cucumbers"), counts = c(5, 10, 12))

ggplot(data = data) + 
  geom_bar(aes(x = labs, y = counts), stat="identity")`

有类似的问题here,但解决方案涉及themeelement_text。我正在尝试直接使用轴标签。

我可以手动执行此操作,如下所示:

breaks <- levels(data$labs)
labels <- breaks
labels[2] <- expression(bold("Cucumbers"))

ggplot(data = data) + 
  geom_bar(aes(x = labs, y = counts), stat="identity") + 
  scale_x_discrete(label = labels, breaks = breaks)

但是,如果我尝试通过索引而不是输入“Cucumbers”来执行此操作,则会收到以下错误:

breaks <- levels(data$labs)
labels <- breaks
labels[2] <- expression(bold(labels[2]))

ggplot(data = data) + 
  geom_bar(aes(x = labs, y = counts), stat="identity") + 
  scale_x_discrete(label = labels, breaks = breaks)

这是有道理的,因为它没有评估labels[2]。但是,有谁知道如何强迫它这样做?谢谢。

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    怎么样

    breaks <- levels(data$labs)
    labels <- as.expression(breaks)
    labels[[2]] <- bquote(bold(.(labels[[2]])))
    
    ggplot(data = data) + 
      geom_bar(aes(x = labs, y = counts), stat="identity") + 
      scale_x_discrete(label = labels, breaks = breaks)
    

    这里我们更明确地说明了到表达式的转换,我们使用bquote() 将标签的值插入到表达式本身中。

    【讨论】:

    • 是的! bquote.( ) 是我需要的。谢谢。该函数名称是否有助记符?反向引用?
    • 从帮助页面来看,它是“LISP 反引号宏的类似物”,因此非常接近。
    • @MrFlick 我怎样才能对多个项目执行此操作?例如位置 2 和 3?我也可以通过指定因子名称来做到这一点,例如“黄瓜”和“橙子”?谢谢!
    • @Stefan 您可能想通过一个可重复的示例提出一个新问题,该示例说明您的案例有何不同。 labels 基本上像列表一样询问,因此您可以使用任何用于迭代列表的函数。标签的顺序按照中断的顺序排列,因此您可以毫无问题地在一个中查找值并在另一个中建立索引。
    【解决方案2】:

    另一种选择是使用theme 动态设置字体,尽管我不确定这在某种意义上是比@MrFlick 的答案更好或更差的方法:

    breaks <- levels(data$labs)
    
    # Reference breaks by name
    toBold = "Cucumbers"
    
    ggplot(data = data) + 
      geom_bar(aes(x = labs, y = counts), stat="identity") + 
      scale_x_discrete(label = labels, breaks = breaks) +
      theme(axis.text.x=
            element_text(face=ifelse(breaks %in% toBold, "bold", "plain")))
    
    # Reference breaks by position
    label.index=2
    
    ggplot(data = data) + 
      geom_bar(aes(x = labs, y = counts), stat="identity") + 
      scale_x_discrete(label = labels, breaks = breaks) +
      theme(axis.text.x=
            element_text(face=ifelse(breaks %in% labels[match(label.index, 1:length(breaks))], 
                                     "bold", "plain")))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多