问题描述
在这里,我想寻求任何解决着色问题的方法,同时保持总体图布局,可能使用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)
这正是我需要的布局,但是我无法找到一种为列中的不同行着色的方法,它只能为行中的列着色。
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)
是否存在任何R或python解决方案来解决此问题并获得与上述完全相同的图布局,但条形根据提供的颜色矢量进行了着色?
解决方法
也许可以通过ggplot2
和tidyverse
函数尝试这种方法:
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())
输出:
另一个选项可以是:
#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())
输出: