【问题标题】:customize ggplot2 axis labels with different colors自定义不同颜色的ggplot2轴标签
【发布时间】:2016-12-16 04:22:33
【问题描述】:

我有一个从 ggplot2 创建的基本条形图。 y 变量包含正值和负值,大约一半的值向量是负值。我想自定义轴标签,以便当相应 x 因子的 y 值为负数时,其标签为红色。这是一个可重现的示例:

#Create data
x <- c("a","b","c","d","e","f")
y <- c("10", "9","-10","11","-3","-15")
data <- data.frame(x, y)
data$y <- as.numeric(as.character(data$y))

data$category <- ifelse(as.numeric(data$y)<0, 0, 1)
data$category <- as.factor(data$category)

#Graph
library(cowplot) #theme
library(ggplot2)

ggplot(data, aes(x=x, y=y)) + 
  geom_bar(stat = "identity", aes(fill=category)) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  theme(axis.text.x = element_text(colour = "black"))

我需要一种将“c”、“e”和“f”的标签颜色更改为我选择的颜色的方法。我尝试切换theme(aes(axis.text.x=element_text(colour=Air_pricier))),但这产生了错误。提前致谢。

【问题讨论】:

    标签: r ggplot2 geom-bar


    【解决方案1】:

    在 a-s-k 的回答的基础上,我使用胶水模板和离散比例将其置于更灵活的形式中。使用此选项,您无需更改数据,只需在刻度中定义一个标签器即可为您完成所有工作,如果您想在许多具有不同数据的相似图中为 x 轴着色,这很方便。

    (在原始问题的情况下,颜色取决于更多的数据,而不仅仅是 x 值,但我想这对某些用户来说仍然很方便。)

    library(ggtext)
    library(tidyverse)
    library(glue)
    
    #Create data
    x <- c("a","b","c","d","e","f")
    y <- c("10", "9","-10","11","-3","-15")
    data <- data.frame(x, y)
    data$y <- as.numeric(as.character(data$y))
    
    data$category <- ifelse(as.numeric(data$y)<0, 0, 1)
    data$category <- as.factor(data$category)
    
    # create the labels 
    my_labels <- glue_data(
      data, 
      "<span style='color: {if_else(category==0, 'red', 'blue')}'>{x}</span>"
      )
    names(my_labels) <- data$x
    
    # plot as you normally would
    # use element_markdown as axis.text.x
    # and the labels defined before as labels in a discrete scale
    ggplot(data, aes(x=x, y=y)) + 
      geom_bar(stat = "identity", aes(fill=category)) +
      theme(
        axis.text.x = element_markdown(angle = 45, hjust = 1)
      ) + 
      scale_x_discrete(labels=my_labels)
    

    【讨论】:

      【解决方案2】:

      我也收到了@Mark Neal 评论中提到的警告信息;这让我很紧张。这是ggtext 包的另一种方法。您可以将 x 轴的类别包裹在 &lt;span&gt;s 中并指定您想要的颜色,然后在主题中使用 element_markdown

      library(ggtext)
      library(tidyverse)
      
      data %>%
        mutate(x.label = paste("<span style = 'color: ",
                               ifelse(y > 0, "black", "red"),
                               ";'>",
                               x,
                               "</span>", sep = ""),
               x.label = fct_reorder(x.label, as.character(x))) %>%
        ggplot(aes(x=x.label, y=y)) + 
        geom_bar(stat = "identity", aes(fill=category)) +
        theme(axis.text.x = element_markdown(angle = 45, hjust = 1))
      

      【讨论】:

      • 有没有其他使用 ggplot2 标准动词的替代方法(不使用 ggtext 之类的扩展)?
      • 我找不到。但如果有标准的ggplot2 解决方案,我很乐意使用它!
      • 这很好用。您还可以在scale_x_discrete 的标签中定义它,这样您就不必更改数据中的 x 值。您还可以使用胶水模板以离散比例创建标签,以获得最大的灵活性和便利性。
      【解决方案3】:

      您可以为theme()axis.text.x 选项提供颜色矢量:

      a <- ifelse(data$category == 0, "red", "blue")
      
      ggplot(data, aes(x = x, y = y)) + 
          geom_bar(stat = "identity", aes(fill = category)) +
          theme(axis.text.x = element_text(angle = 45, hjust = 1, colour = a))
      

      【讨论】:

      • 是否有更自动的方式来设置轴标签颜色以匹配图例颜色?当有 2 个以上的类别除了按名称之外不容易相互定义时,这一点尤其需要。
      • @andemexoax 使用mystrings &lt;- c("vector","of","categories") 然后a &lt;- ifelse(data$category %in% mystrings, "red", "blue")
      • '@Sumedh' 如果我只想将标签设置为不同的颜色怎么办?
      • 这很好,不过会为我生成警告消息Warning message: Vectorized input to "element_text()" is not officially supported. Results may be unexpected or may change in future versions of ggplot2.
      猜你喜欢
      • 2016-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-06
      • 1970-01-01
      • 1970-01-01
      • 2013-09-30
      相关资源
      最近更新 更多