更改堆叠条形图的颜色,但保持每个 class 的堆叠按递增顺序排列
Changing colors of a stacked bar plot but keeping the stacks of each class in increasing order
我一直在尝试创建堆叠条形图,其中图的颜色与地图中的颜色相关。基本上,我有一定比例的区域被给定的多边形覆盖。我已经提前对 df 进行了排序,因此每个 Class
的堆栈 Proportion
都按降序排列。如果将填充的值设置为连续变量,即 Cluster
(但随后我无法更改堆栈的特定颜色),并且如果我将它们转换为因数 Clu
,则它工作正常堆栈的顺序丢失了,或者我可以设法对它们进行排序,但是对于整个图,不是每个 class...相同的 Cluster
可以出现在不同的 classes 中,即集群 两个
Num Class Cluster Proportion Clu Order consec
1 9 Class_9 2 0.859 Two 1 1
2 9 Class_9 5 0.141 Five 2 2
3 10 Class_10 2 0.622 Two 1 3
4 10 Class_10 1 0.179 One 2 4
5 10 Class_10 7 0.165 Seven 3 5
6 10 Class_10 6 0.034 Six 4 6
7 11 Class_11 7 1.000 Seven 1 7
8 12 Class_12 2 0.571 Two 1 8
9 12 Class_12 8 0.289 Eight 2 9
10 12 Class_12 1 0.140 One 3 10
11 13 Class_13 8 0.581 Eight 1 11
12 13 Class_13 4 0.210 Four 2 12
13 13 Class_13 2 0.112 Two 3 13
14 13 Class_13 3 0.079 Three 4 14
15 13 Class_13 5 0.018 Five 5 15
我已经成功地使用代码走了这么远。
cols<-c(One='Blue',Two='Red',Three='Yellow',Four='lightblue',Five='darkgrey',Six='Black', Seven='cyan',Eight='Green')
ggplot(Tx, aes(x=Class, y=Proportion, fill= Clu)) +
geom_col(width = .7, colour="black", lwd=0.1) +
geom_text(aes(label=ifelse(Proportion >= 0.05, sprintf("%.2f",Proportion),"")),
position=position_stack(vjust=0.5), colour="white") +
coord_flip() +
scale_y_continuous(labels = function(y) paste0(y))+
scale_fill_manual(values = cols)+
labs(y="", x="")
总而言之,我想要一个图表,其中 比例 每个 class 的递增顺序,但是我为每个簇指定的颜色
一个选项(与您的想法略有不同)是使用 position.dodge
和 tidytext::reorder_within
。
library(tidyverse)
library(tidytext)
cols<-c('Blue','Red','Yellow','lightblue','darkgrey','Black', 'cyan', 'Green')
Tx %>%
mutate(Cluster2 = reorder_within(Cluster, Proportion, Class)) %>%
ggplot(aes(Cluster2, Proportion, fill = as.factor(Cluster))) +
geom_col(position = position_dodge2(preserve = "single")) +
scale_x_reordered() +
scale_fill_manual(values = cols) +
coord_flip() +
facet_grid(Class~., scales = 'free_y', space = 'free')
如果您确实需要具有不同顺序的堆叠条形图,另一种选择是分别为每个 class 生成绘图(允许正确的顺序),然后将它们全部堆叠在一起。这可以使用 cowplot::plot_grid
和 cowplot::get_legend
.
来完成
生成顺序正确的地块列表并将它们堆叠成一个地块。
library(tidyverse)
library(cowplot)
Tx2 <- Tx %>%
mutate(Cluster = factor(Cluster))
cols<-c(One='Blue',Two='Red',Three='Yellow',Four='lightblue',Five='darkgrey',Six='Black', Seven='cyan',Eight='Green')
p_list <- lapply(unique(Tx2$Class), function(x){
p <- Tx2 %>%
filter(Class == x) %>%
ggplot(aes(Class, Proportion, fill = reorder(Clu, -Proportion))) +
geom_col(color = 'black') +
geom_text(aes(label=ifelse(Proportion >= 0.05, sprintf("%.2f",Proportion),"")),
position=position_stack(vjust=0.5),
color = 'white') +
coord_flip() +
scale_fill_manual(values = cols) +
labs(x = NULL, y = NULL) +
theme_minimal() +
theme(legend.position = 'none')
if (x != 'Class_13') p <- p + theme(axis.text.x = element_blank())
p
})
p_col <- plot_grid(plotlist = p_list,
ncol = 1,
align = 'v',
rel_heights = c(rep(1,4), 1.2))
生成要使用的图例。
p <- ggplot(Tx2, aes(Class, Proportion, fill = reorder(Clu, as.numeric(Cluster)))) +
geom_col(color = 'black') +
scale_fill_manual(values = cols, labels= 1:8, name = 'Cluster')
l <- cowplot::get_legend(p)
将堆叠图和图例放在一起。
plot_grid(p_col, l, rel_widths = c(3, .4))
数据
Tx <- read.table(text =
' Num Class Cluster Proportion Clu Order consec
1 9 Class_9 2 0.859 Two 1 1
2 9 Class_9 5 0.141 Five 2 2
3 10 Class_10 2 0.622 Two 1 3
4 10 Class_10 1 0.179 One 2 4
5 10 Class_10 7 0.165 Seven 3 5
6 10 Class_10 6 0.034 Six 4 6
7 11 Class_11 7 1.000 Seven 1 7
8 12 Class_12 2 0.571 Two 1 8
9 12 Class_12 8 0.289 Eight 2 9
10 12 Class_12 1 0.140 One 3 10
11 13 Class_13 8 0.581 Eight 1 11
12 13 Class_13 4 0.210 Four 2 12
13 13 Class_13 2 0.112 Two 3 13
14 13 Class_13 3 0.079 Three 4 14
15 13 Class_13 5 0.018 Five 5 15')
我一直在尝试创建堆叠条形图,其中图的颜色与地图中的颜色相关。基本上,我有一定比例的区域被给定的多边形覆盖。我已经提前对 df 进行了排序,因此每个 Class
的堆栈 Proportion
都按降序排列。如果将填充的值设置为连续变量,即 Cluster
(但随后我无法更改堆栈的特定颜色),并且如果我将它们转换为因数 Clu
,则它工作正常堆栈的顺序丢失了,或者我可以设法对它们进行排序,但是对于整个图,不是每个 class...相同的 Cluster
可以出现在不同的 classes 中,即集群 两个
Num Class Cluster Proportion Clu Order consec
1 9 Class_9 2 0.859 Two 1 1
2 9 Class_9 5 0.141 Five 2 2
3 10 Class_10 2 0.622 Two 1 3
4 10 Class_10 1 0.179 One 2 4
5 10 Class_10 7 0.165 Seven 3 5
6 10 Class_10 6 0.034 Six 4 6
7 11 Class_11 7 1.000 Seven 1 7
8 12 Class_12 2 0.571 Two 1 8
9 12 Class_12 8 0.289 Eight 2 9
10 12 Class_12 1 0.140 One 3 10
11 13 Class_13 8 0.581 Eight 1 11
12 13 Class_13 4 0.210 Four 2 12
13 13 Class_13 2 0.112 Two 3 13
14 13 Class_13 3 0.079 Three 4 14
15 13 Class_13 5 0.018 Five 5 15
我已经成功地使用代码走了这么远。
cols<-c(One='Blue',Two='Red',Three='Yellow',Four='lightblue',Five='darkgrey',Six='Black', Seven='cyan',Eight='Green')
ggplot(Tx, aes(x=Class, y=Proportion, fill= Clu)) +
geom_col(width = .7, colour="black", lwd=0.1) +
geom_text(aes(label=ifelse(Proportion >= 0.05, sprintf("%.2f",Proportion),"")),
position=position_stack(vjust=0.5), colour="white") +
coord_flip() +
scale_y_continuous(labels = function(y) paste0(y))+
scale_fill_manual(values = cols)+
labs(y="", x="")
总而言之,我想要一个图表,其中 比例 每个 class 的递增顺序,但是我为每个簇指定的颜色
一个选项(与您的想法略有不同)是使用 position.dodge
和 tidytext::reorder_within
。
library(tidyverse)
library(tidytext)
cols<-c('Blue','Red','Yellow','lightblue','darkgrey','Black', 'cyan', 'Green')
Tx %>%
mutate(Cluster2 = reorder_within(Cluster, Proportion, Class)) %>%
ggplot(aes(Cluster2, Proportion, fill = as.factor(Cluster))) +
geom_col(position = position_dodge2(preserve = "single")) +
scale_x_reordered() +
scale_fill_manual(values = cols) +
coord_flip() +
facet_grid(Class~., scales = 'free_y', space = 'free')
如果您确实需要具有不同顺序的堆叠条形图,另一种选择是分别为每个 class 生成绘图(允许正确的顺序),然后将它们全部堆叠在一起。这可以使用 cowplot::plot_grid
和 cowplot::get_legend
.
生成顺序正确的地块列表并将它们堆叠成一个地块。
library(tidyverse)
library(cowplot)
Tx2 <- Tx %>%
mutate(Cluster = factor(Cluster))
cols<-c(One='Blue',Two='Red',Three='Yellow',Four='lightblue',Five='darkgrey',Six='Black', Seven='cyan',Eight='Green')
p_list <- lapply(unique(Tx2$Class), function(x){
p <- Tx2 %>%
filter(Class == x) %>%
ggplot(aes(Class, Proportion, fill = reorder(Clu, -Proportion))) +
geom_col(color = 'black') +
geom_text(aes(label=ifelse(Proportion >= 0.05, sprintf("%.2f",Proportion),"")),
position=position_stack(vjust=0.5),
color = 'white') +
coord_flip() +
scale_fill_manual(values = cols) +
labs(x = NULL, y = NULL) +
theme_minimal() +
theme(legend.position = 'none')
if (x != 'Class_13') p <- p + theme(axis.text.x = element_blank())
p
})
p_col <- plot_grid(plotlist = p_list,
ncol = 1,
align = 'v',
rel_heights = c(rep(1,4), 1.2))
生成要使用的图例。
p <- ggplot(Tx2, aes(Class, Proportion, fill = reorder(Clu, as.numeric(Cluster)))) +
geom_col(color = 'black') +
scale_fill_manual(values = cols, labels= 1:8, name = 'Cluster')
l <- cowplot::get_legend(p)
将堆叠图和图例放在一起。
plot_grid(p_col, l, rel_widths = c(3, .4))
数据
Tx <- read.table(text =
' Num Class Cluster Proportion Clu Order consec
1 9 Class_9 2 0.859 Two 1 1
2 9 Class_9 5 0.141 Five 2 2
3 10 Class_10 2 0.622 Two 1 3
4 10 Class_10 1 0.179 One 2 4
5 10 Class_10 7 0.165 Seven 3 5
6 10 Class_10 6 0.034 Six 4 6
7 11 Class_11 7 1.000 Seven 1 7
8 12 Class_12 2 0.571 Two 1 8
9 12 Class_12 8 0.289 Eight 2 9
10 12 Class_12 1 0.140 One 3 10
11 13 Class_13 8 0.581 Eight 1 11
12 13 Class_13 4 0.210 Four 2 12
13 13 Class_13 2 0.112 Two 3 13
14 13 Class_13 3 0.079 Three 4 14
15 13 Class_13 5 0.018 Five 5 15')