【问题标题】:Multilevel pie charts with consistent coloring具有一致着色的多级饼图
【发布时间】:2017-12-18 20:28:48
【问题描述】:

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

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 个序列 *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,它们的多数序列应该是相同的颜色)。

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

【问题讨论】:

  • 数据中的seq 列是否应该是sequence?绘图代码使用sequence 作为填充列。
  • 你是对的@epi10。我对错误表示歉意。您在下面的回答实际上解决了它并且非常有帮助。我将在今天晚些时候对解决方案发表评论。 (非常感谢!)

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


【解决方案1】:

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

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

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

(我还在上面的代码中假设 sequence 有 2,951 个唯一级别。更好的方法是 pal &lt;- 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 是您单独的数据框。

【讨论】:

  • 这对 @eipi10 有很大帮助!我所做的是我创建了一个数据框 (dfcolors),它以 seq color 的形式组织了所有可能的序列及其相应的颜色(制表符分隔)。然后我做了以下事情:set.seed(2)pal=setNames(pal2, unique(dfcolors$seq)) 然后为我想要的每个数据帧运行上面的 ggplot 代码。工作完美!再次感谢!
猜你喜欢
  • 1970-01-01
  • 2013-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-28
相关资源
最近更新 更多