具有一致着色的多级饼图

时间:2017-12-18 20:28:48

标签: r ggplot2 charts pie-chart color-palette

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

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个隔间= 8853行。

到目前为止,我所使用的代码对单个文件效果很好,序列的顺序不一定遵循我的自定义调色板的顺序,也不是每个文件的颜色一致(即“AAGTGT”序列始终是不同输入文件的颜色相同)。 @Prem帮助了我一些类似的question,但我无法弄清楚这里发生了什么。代码如下:

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,其多数序列应该是相同的颜色)。 enter image description here

任何帮助都会非常感激,因为我认为这种表示对我的数据信息非常有帮助。谢谢大家!

1 个答案:

答案 0 :(得分:1)

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

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

现在像往常一样运行你的情节代码。通过使用名称为sequence级别的命名颜色矢量,您应始终获得分配给相同序列的相同颜色。

(我还在上面的代码中假设有{9}的2,951个唯一级别。更好的方法是sequence,以便从数据中获取颜色数量,而不是硬编码。)

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

如果您有多个数据框可以包含不同的序列,则根据所有数据帧中唯一序列的集合创建命名颜色矢量。理想情况下,您的数据框将位于列表中(让我们假设它被称为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))) df1df2是您的独立数据框。