自定义具有不同颜色的ggplot2轴标签

Cyr*_*ian 32 r ggplot2 geom-bar

我有一个基本的条形图,我是从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"))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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

Sum*_*edh 48

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

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))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 这很好,但会为我生成一条警告消息`警告消息:“element_text()”的矢量化输入不受官方支持。结果可能会出乎意料,或者可能会在 ggplot2 的未来版本中发生变化。` (6认同)
  • 警告消息`警告消息:“element_text()”的矢量化输入不受官方支持。结果可能会出乎意料,或者可能会在 ggplot2 的未来版本中发生变化。可以通过使用“ggtext::element_markdown”而不是正式支持矢量化输入的“element_text”来避免。 (4认同)
  • 有没有一种更自动的方式来设置轴标签颜色以匹配图例颜色?当有两个以上的类别(按名称)很难相互定义时,尤其需要此功能。 (2认同)

sna*_*aut 6

在询问的答案的基础上,我使用胶水模板和离散比例将其以更灵活的形式放置。使用此选项,您不必更改数据,而只需在比例中定义一个标签器即可为您完成所有操作,如果您想使用不同数据在许多类似图中为 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)
Run Code Online (Sandbox Code Playgroud)


A. *_* K. 5

我也收到了@Mark Neal 评论中提到的警告信息;这让我很紧张。这是该ggtext包的另一种方法。您可以将 x 轴的类别包裹在<span>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))
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

  • 这很好用。您还可以在 `scale_x_discrete` 的标签中定义它,这样您就不必更改数据中的 x 值。您还可以使用胶水模板以离散比例创建标签,以获得最大的灵活性和便利性。 (2认同)