具有一致着色的多级饼图
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)))
其中 df1
、df2
和 df3
是您的独立数据框。
我正在尝试为以下格式的多个文件创建多级饼图:
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)))
其中 df1
、df2
和 df3
是您的独立数据框。