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

问题描述 投票:0回答:4

我有一个从 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
4个回答
112
投票

您可以向

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))


24
投票

我也收到@Mark Neal 评论中提到的警告消息;这让我很紧张。这是使用

ggtext
包的另一种方法。您可以将 x 轴的类别包装在
<span>
中并指定所需的颜色,然后在主题中使用
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))


6
投票

基于 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)

0
投票

另一种方法是将标签创建为单独的绘图对象,并使用诸如owplot或patchwork之类的包来组合它们。

#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)

# Base plot
library(ggplot2)

pl_base <-
  data |>
  ggplot(aes(x = x))

# Graph
pl_points <-
  pl_base +
  geom_bar(stat = "identity", aes(y = y, fill = category)) +
  theme(plot.margin = unit(c(0,0,0,0), "lines"),
        axis.title.x = element_blank(),
        axis.text.x = element_blank())

# x axis labels
pl_xlab <- pl_base +
  geom_text(aes(label = x, color = category), y = 0, size = 3) +
  scale_y_continuous(expand = c(0, 0), limits = c(0, 0)) +
  #guides(color = "none") + # uncomment to remove the extra legend
  theme_void()

# Combine with patchwork
library(patchwork)
pl_final <-
  pl_points +
  pl_xlab +
  plot_layout(ncol = 1,
              heights = c(NA, 0.07),
              guides = "collect")

# Combine with cowplot
library(cowplot)
pl_final <-
  plot_grid(pl_points,
            pl_xlab,
            ncol = 1,
            align = "hv",
            axis = "b",
            rel_heights = c(1, 0.07))

pl_final

这非常灵活,但在更改最终绘图输出的宽度/高度时可能很难正确定位标签。

© www.soinside.com 2019 - 2024. All rights reserved.