我正在尝试为以下格式的多个文件创建多级饼图:
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,其多数序列应该是相同的颜色)。
任何帮助都会非常感激,因为我认为这种表示对我的数据信息非常有帮助。谢谢大家!
答案 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)))
,df1
和df2
是您的独立数据框。