更改堆叠条形图的颜色,但保持每个 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.dodgetidytext::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_gridcowplot::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')