【问题标题】:Format specific axis labels in ggplot2 without underlying data在没有基础数据的情况下格式化 ggplot2 中的特定轴标签
【发布时间】:2018-02-02 11:29:42
【问题描述】:

如果轴标签包含特定文本,我会尝试将其设为粗体。我正在尝试对一个绘图执行此操作,该绘图是一个也操纵我的数据的函数的输出,因此我的输入数据与输出中标签的顺序之间不再有直接关系。所以添加theme(axis.text.y = element_text(face = ifelse(levels(df$category) == "xxx", "bold", "plain"))) 不起作用(它会将错误的标签变为粗体)。

作为一个具体的例子,如果我只是将 this box plot 的花瓣长度按虹膜物种作为对象,如果我不知道物种的顺序,是否可以添加一个将“setosa”变为粗体的图层出现在?

更新:一个可重现的例子:

library(tidyverse)
library(rlang)

test <- tribble(
    ~AreaName, ~Value,
    "London",   1,
    "New York", 5,
    "Paris",    3
)

compare_areas <- function(data, area, value) {

    area <- enquo(area)
    value <- enquo(value)

    newLevels <- data[order(data[[quo_text(value)]], decreasing = TRUE), ][[quo_text(area)]]

    print(newLevels)


    data[[quo_text(area)]] <- factor(data[[quo_text(area)]], levels = newLevels)
    print(data)
    p <- ggplot(data, aes_string(x = quo_text(area), 
                                             y = quo_text(value))) +
        coord_flip() +
        geom_col()

    return(p)
}


compare_areas(data = test,
              area = AreaName,
              value = Value)

Plot output。因此,例如,我想让 Paris 加粗,但我不知道级别将如何排序。

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    您必须使用 levels()。当您应用df$category == "xxx" 时,您将获得与df 中的行一样多的boldplain 值。

    library(ggplot2)
    ggplot(iris, aes(Species, Petal.Length)) +
        geom_boxplot() +
        theme(axis.text.x = element_text(face = 
            ifelse(levels(iris$Species) == "setosa", "bold", "plain")))
    

    iris 数据集也是如此:

    length(ifelse(iris$Species == "setosa", "bold", "plain"))
    [1] 150
    length(ifelse(levels(iris$Species) == "setosa", "bold", "plain"))
    [1] 3
    

    【讨论】:

    • 是的,抱歉,这是我的错误,但使用 levels() 仍然不起作用,因为返回绘图的函数也会重新排序级别。也许理想的情况是该函数将被拆分为一个数据清理函数和一个绘图函数,但我现在对此无能为力
    • @Oliver 那么你应该用可重复的例子更新你的问题:添加函数和数据
    • 这个解决方案对我也不起作用。错误的级别被加粗。但我在这里找到了一个很好的解决方案:stackoverflow.com/questions/39694490/…
    【解决方案2】:

    我将猜测一下,并假设您所拥有的只是 ggplot 对象本身,即在这样做之后:

    library(ggplot2)
    g1 <- ggplot(iris, aes(Species, Petal.Length)) +
        geom_boxplot()
    

    你只有g1。由于将用于渲染绘图的数据存储在g1 中,因此您可以根据@Oliver 的回答构建如下:

    g1 + theme(axis.text.x = element_text(face = 
        ifelse(levels(g1$data$Species) == "setosa", "bold", "plain")))
    

    【讨论】:

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