ggplot2 条形图中的颜色 X 轴
Color X axis in ggplot2 bar plot
我需要帮助才能为 ggplot2 图的 x 轴着色。
到目前为止,我可以做到以下几点:
head(data)
x y group Axis_color
1 A 25 F G1
2 A 88 G G1
3 A 88 H G1
4 A 22 I G1
5 A 18 J G1
6 B 54 F G3
color_list<- c("F"="orange", "G"="darkgreen", "H"="grey", "I"="pink", "J"="purple", "G1"="blue","G2"="red","G3"="green")
ggplot(data, aes(x = x, y = y, fill = group, label = y)) +
coord_flip()+
geom_bar(stat = "identity")
给出:
但我想作为列“Axis_color”,以便将存储在 color_list
中的颜色添加到 x 轴并得到:
如您所见,我也得到了两个不同的图例轴。
如果有帮助的话,这里是数据:
structure(list(x = c("A", "A", "A", "A", "A", "B", "B", "B",
"B", "B", "C", "C", "C", "C", "C", "D", "D", "D", "D", "D", "E",
"E", "E", "E", "E"), y = c(25, 88, 88, 22, 18, 54, 25, 37, 68,
72, 36, 84, 17, 64, 48, 15, 17, 72, 61, 25, 66, 10, 18, 99, 63
), group = c("F", "G", "H", "I", "J", "F", "G", "H", "I", "J",
"F", "G", "H", "I", "J", "F", "G", "H", "I", "J", "F", "G", "H",
"I", "J"), Axis_color = c("G1", "G1", "G1", "G1", "G1", "G3",
"G3", "G3", "G3", "G3", "G1", "G1", "G1", "G1", "G1", "G2", "G2",
"G2", "G2", "G2", "G3", "G3", "G3", "G3", "G3")), row.names = c(NA,
-25L), class = "data.frame")
我能想到的包含图例的最方便的解决方案是使用 geom_text()
放置假轴标签。如果不需要图例,我会推荐 ggtext。
通过将文本放置在 x = -Inf
处,您可以将其放置在轴的最小值处,并且可以使用 hjust
进一步将文本推到外侧。您需要关闭坐标中的裁剪才能使其工作。或者你也可以设置 x = -10
或其他东西,但你必须调整比例限制并为每个图定制这个值。
# data <- structure(...) # omitted for brevity
library(ggplot2)
color_list<- c("F"="orange", "G"="darkgreen", "H"="grey", "I"="pink", "J"="purple", "G1"="blue","G2"="red","G3"="green")
ggplot(data, aes(x = y, y = x, fill = group, label = x)) +
geom_col() +
geom_text(data = ~ subset(.x, !duplicated(x)),
aes(x = -Inf, colour = Axis_color), hjust = 2) +
scale_fill_manual(values = color_list[1:5]) +
scale_colour_manual(values = color_list[-c(1:5)]) +
coord_cartesian(clip = "off") +
theme(axis.text.y = element_text(colour = NA))
小旁注:我用 geom_col()
替换了 geom_bar(stat = "identity")
,因为这看起来更干净,并交换了 x 和 y 美学,消除了对 coord_flip()
.
的需要
另一种实现您想要的结果的选择是使用 ggtext
包,它允许通过一些 HTML/CSS.
为轴标签着色
为了获得第二个图例,我使用了 ggnewscale 包,就像@teunbrand 的方法一样。然而,为了使这项工作我们还必须添加第二个 geom
。为此,我在设置 y=0
.
的地方添加了一个助手 geom_col
library(ggplot2)
library(ggtext)
library(dplyr)
library(tibble)
color_list <- c("F"="orange", "G"="darkgreen", "H"="grey", "I"="pink", "J"="purple", "G1"="blue","G2"="red","G3"="green")
axis_color <- dplyr::distinct(data, x, Axis_color) %>%
tibble::deframe()
ggplot(data, aes(x = x, y = y, fill = group, label = y)) +
coord_flip()+
geom_bar(stat = "identity") +
scale_fill_manual(values = color_list, limits = force, guide = guide_legend(order= 1)) +
scale_x_discrete(labels = ~ glue::glue("<span style='color: {color_list[axis_color[.x]]}'>{.x}</span>")) +
ggnewscale::new_scale_fill() +
geom_col(aes(y = 0, fill = Axis_color)) +
scale_fill_manual(values = color_list[unique(data$Axis_color)], guide = guide_legend(order= 2)) +
theme(axis.text.y = ggtext::element_markdown())
我需要帮助才能为 ggplot2 图的 x 轴着色。
到目前为止,我可以做到以下几点:
head(data)
x y group Axis_color
1 A 25 F G1
2 A 88 G G1
3 A 88 H G1
4 A 22 I G1
5 A 18 J G1
6 B 54 F G3
color_list<- c("F"="orange", "G"="darkgreen", "H"="grey", "I"="pink", "J"="purple", "G1"="blue","G2"="red","G3"="green")
ggplot(data, aes(x = x, y = y, fill = group, label = y)) +
coord_flip()+
geom_bar(stat = "identity")
给出:
但我想作为列“Axis_color”,以便将存储在 color_list
中的颜色添加到 x 轴并得到:
如您所见,我也得到了两个不同的图例轴。
如果有帮助的话,这里是数据:
structure(list(x = c("A", "A", "A", "A", "A", "B", "B", "B",
"B", "B", "C", "C", "C", "C", "C", "D", "D", "D", "D", "D", "E",
"E", "E", "E", "E"), y = c(25, 88, 88, 22, 18, 54, 25, 37, 68,
72, 36, 84, 17, 64, 48, 15, 17, 72, 61, 25, 66, 10, 18, 99, 63
), group = c("F", "G", "H", "I", "J", "F", "G", "H", "I", "J",
"F", "G", "H", "I", "J", "F", "G", "H", "I", "J", "F", "G", "H",
"I", "J"), Axis_color = c("G1", "G1", "G1", "G1", "G1", "G3",
"G3", "G3", "G3", "G3", "G1", "G1", "G1", "G1", "G1", "G2", "G2",
"G2", "G2", "G2", "G3", "G3", "G3", "G3", "G3")), row.names = c(NA,
-25L), class = "data.frame")
我能想到的包含图例的最方便的解决方案是使用 geom_text()
放置假轴标签。如果不需要图例,我会推荐 ggtext。
通过将文本放置在 x = -Inf
处,您可以将其放置在轴的最小值处,并且可以使用 hjust
进一步将文本推到外侧。您需要关闭坐标中的裁剪才能使其工作。或者你也可以设置 x = -10
或其他东西,但你必须调整比例限制并为每个图定制这个值。
# data <- structure(...) # omitted for brevity
library(ggplot2)
color_list<- c("F"="orange", "G"="darkgreen", "H"="grey", "I"="pink", "J"="purple", "G1"="blue","G2"="red","G3"="green")
ggplot(data, aes(x = y, y = x, fill = group, label = x)) +
geom_col() +
geom_text(data = ~ subset(.x, !duplicated(x)),
aes(x = -Inf, colour = Axis_color), hjust = 2) +
scale_fill_manual(values = color_list[1:5]) +
scale_colour_manual(values = color_list[-c(1:5)]) +
coord_cartesian(clip = "off") +
theme(axis.text.y = element_text(colour = NA))
小旁注:我用 geom_col()
替换了 geom_bar(stat = "identity")
,因为这看起来更干净,并交换了 x 和 y 美学,消除了对 coord_flip()
.
另一种实现您想要的结果的选择是使用 ggtext
包,它允许通过一些 HTML/CSS.
为了获得第二个图例,我使用了 ggnewscale 包,就像@teunbrand 的方法一样。然而,为了使这项工作我们还必须添加第二个 geom
。为此,我在设置 y=0
.
geom_col
library(ggplot2)
library(ggtext)
library(dplyr)
library(tibble)
color_list <- c("F"="orange", "G"="darkgreen", "H"="grey", "I"="pink", "J"="purple", "G1"="blue","G2"="red","G3"="green")
axis_color <- dplyr::distinct(data, x, Axis_color) %>%
tibble::deframe()
ggplot(data, aes(x = x, y = y, fill = group, label = y)) +
coord_flip()+
geom_bar(stat = "identity") +
scale_fill_manual(values = color_list, limits = force, guide = guide_legend(order= 1)) +
scale_x_discrete(labels = ~ glue::glue("<span style='color: {color_list[axis_color[.x]]}'>{.x}</span>")) +
ggnewscale::new_scale_fill() +
geom_col(aes(y = 0, fill = Axis_color)) +
scale_fill_manual(values = color_list[unique(data$Axis_color)], guide = guide_legend(order= 2)) +
theme(axis.text.y = ggtext::element_markdown())