如何使用R ggplot2创建堆叠的直方图作为条形码图,并具有来自R基本表的按行颜色模式

问题描述

此问题最初是here发布的,尚未找到解决方案。

在这里,我想寻求任何解决着色问题的方法,同时保持总体图布局,可能使用ggplot2或其他方式。

简而言之,我想绘制类似于条形码的图,条高反映行的列差异,条宽反映行的总和。

test.matrix <- matrix(c(70,120,65,140,13,68,46,294,52,410),ncol=2,byrow=TRUE)
rownames(test.matrix) <- c("BC.1","BC.2","GC","MO","EB")
colnames(test.matrix) <- c("12m","3m")
test.matrix <- as.table(test.matrix)

test.matrix
     12m  3m
BC.1  70 120
BC.2  65 140
GC    13  68
MO    46 294
EB    52 410

plot(test.matrix)

layout_NO_color

这正是我需要的布局,但是我无法找到一种为列中的不同行着色的方法,它只能为行中的列着色。

color.ct <- c("gold","yellowgreen","navy","royalblue","orangered")
names(x = color.ct) <- rownames(test.matrix)
color.ct
         BC.1          BC.2            GC            MO            EB 
       "gold" "yellowgreen"        "navy"   "royalblue"   "orangered" 
plot(test.matrix,col= color.ct)

layout_color

是否存在任何R或python解决方案来解决此问题并获得与上述完全相同的图布局,但条形根据提供的颜色矢量进行了着色?

解决方法

也许可以通过ggplot2tidyverse函数尝试这种方法:

library(tidyverse)
#Code
test.matrix %>% as.data.frame.matrix %>% rownames_to_column('Var') %>%
  pivot_longer(-Var) %>%
  mutate(name=factor(name,levels = rev(unique(name)),ordered = T)) %>%
  ggplot(aes(x=name,y=value,fill=Var))+
  geom_bar(stat='identity',color='black',position='fill')+
  coord_flip()+
  scale_fill_manual(values=c('BC.1'="gold",'BC.2'="yellowgreen",'GC'="navy",'MO'="royalblue",'EB'="orangered"))+
  theme(axis.text.x = element_blank(),axis.ticks.x = element_blank())

输出:

enter image description here

另一个选项可以是:

#Code 2
test.matrix %>% as.data.frame.matrix %>% rownames_to_column('Var') %>%
  pivot_longer(-Var) %>%
  mutate(name=factor(name,color='black')+
  coord_flip()+
  facet_wrap(name~.,scales = 'free',strip.position = 'left',ncol = 1)+
  scale_fill_manual(values=c('BC.1'="gold",'EB'="orangered"))+
  theme(axis.text.y = element_blank(),axis.ticks.y = element_blank())

输出:

enter image description here