具有一致着色的多级饼图

Multilevel pie charts with consistent coloring

我正在尝试为以下格式的多个文件创建多级饼图:

117.txt

compartment percent sequence
dna         90      AAGTGT
dna          3      AAGTGG
dna          0      AAAAAA
...
rna         75      AAGTGT
rna         10      AAAAAA
rna         10      AAGTGG
...
...
plasma      75      AAGTGT
plasma      10      AAGTGG
plasma       0      AAAAAA

我正在尝试通过 ggplot 创建同心饼图作为图形,每个不同序列基于每个文件(如上面的简化文件)具有独特的颜色(我可以将其作为数据框读入 df ).对于每个隔室,存在 2951 个唯一序列,并且有百分比指示,否则用“0”指示。因此,每个文件有 2951 seqs *3 compartments = 8853 行。

到目前为止,我的代码适用于单个文件,序列的顺序不一定遵循我的自定义调色板的顺序,每个文件的颜色也不一致(即 "AAGTGT"序列在不同的输入文件中始终是相同的颜色)。 @Prem 用类似的 帮助了我一些,但我不知道这里发生了什么。代码如下:

library(ggplot2)
library(randomcoloR)

pal<-c(randomColor(count=2951))
ggplot(df, aes( x=compartment, y=percent, fill=sequence) ) + labs(title="117") 
    + geom_bar(stat = "identity") + scale_fill_manual(values=pal) 
    + scale_x_discrete(limits=c("dna", "rna", "plasma"), labels=c("plasma"="Plasma\nvRNA", "rna"="RNA","dna"="DNA")) 
    + theme_bw() + theme(legend.position="none") + coord_polar(theta="y") 
    + theme(axis.line = element_blank(), panel.grid.major.x = element_blank(), panel.grid.major.y = element_blank(), 
      panel.grid.minor = element_blank(), panel.border = element_blank(), panel.background = element_blank()) 
    + theme(axis.text=element_blank(), axis.title = element_blank(), axis.ticks = element_blank()) 
    + theme(plot.title = element_text(colour="black", face="bold", size=24, hjust=0.5))

当我 运行 它在我的较大数据文件上时,我的三个隔间中的每一个都有 2951 个序列,不仅我的调色板颜色不一定遵循序列的顺序,而且它们在整个过程中也不一致图表(见附图,了解数据集 #117 和 #129,其多数序列颜色应相同)。

任何帮助将不胜感激,因为我认为这种表示对我的数据消息确实有帮助。谢谢大家!

如果没有可重现的示例,我无法确定,但我认为命名的填充颜色矢量会提供一致的颜色。例如:

set.seed(2) # For reproducibility of random color vector
pal <- randomColor(count=2951)
pal = setNames(pal, unique(df$sequence))

现在运行你的剧情代码如常。通过使用命名的颜色向量,其中名称是 sequence 的级别,您应该始终将相同的颜色分配给相同的序列。

(我还在上面的代码中假设 sequence 有 2,951 个独特的级别。更好的方法是 pal <- randomColor(count=length(unique(df$sequence))) 以便您从数据中获取颜色数量,而不是对其进行硬编码。)

以上内容适用于单个数据帧或一组数据帧,其中每个数据帧都包含可以出现在任何数据帧中的所有可能序列。

如果您有多个可以包含不同序列的数据帧,则根据所有数据帧中唯一序列的集合创建命名的颜色向量。理想情况下,您的数据框将位于列表中(假设它称为 df.list),其中每个元素都是一个数据框。那么你可以这样做:

sequences = unique(unlist(sapply(df.list, function(d) d$sequence)))
set.seed(2)
pal <- randomColor(count=length(sequences))
pal = setNames(pal, sequences)

如果您的数据框作为单独的对象加载(即不在列表中),您可以这样做:

sequences = unique(unlist(sapply(list(df1, df2, df3), function(d) d$sequence)))

其中 df1df2df3 是您的独立数据框。