我在for循环中使用ggplot绘制并保存多个绘图,循环遍历列表。示例列表元素如下所示:
head(genes[[1]])
name fc fdr
gene1 -2.0143529 0.0002
protein1 -3.2256188 0.0001
我使用以下代码绘制:
p<-list()
for(i in 1:length(genes)){
p[[i]]<-ggplot(genes[[i]], aes(name,fc, label= name))+
geom_col(aes(fill=factor(fdr < 0.05)), position = "dodge", width = 1)+
coord_flip()+scale_fill_manual(values = c("#00BFC4","#F8766D"))
现在,问题是我正在使用for循环绘制100多个这样的图,我想始终保持基因(列表元素中的第一行)作为顶部条和蛋白质是由于我省略了所有标签并计划对所有图使用单个图例,因此底栏。但是,ggplot会不断切换不同图表中条形的顺序。有没有办法确保那不会发生并且基因始终保持最佳状态? 谢谢, 词shash
答案 0 :(得分:1)
ggplot
将按名称的字母顺序排列条形码。
例如
library(ggplot2)
df <- data.frame(name = c("A-gene", "B-protein"), fc = c(-2.2, -3.2), fdr = c(0.2, 0.003))
ggplot(df, aes(name,fc, label= name))+
geom_col(aes(fill=factor(fdr < 0.05)), position = "dodge", width = 1)+
coord_flip()+scale_fill_manual(values = c("#00BFC4","#F8766D"))
dev.off()
要按所需顺序获取条形,请将名称变量设为一个因子,然后设置级别的顺序。只需两个名称,您可以使用relevel
,如下所示
library(ggplot2)
df <- data.frame(name = c("A-gene", "B-protein"), fc = c(-2.2, -3.2), fdr = c(0.2, 0.003))
df$name <- relevel(df$name, as.character(df$name[2]))
ggplot(df, aes(name,fc, label= name))+
geom_col(aes(fill=factor(fdr < 0.05)), position = "dodge", width = 1)+
coord_flip()+scale_fill_manual(values = c("#00BFC4","#F8766D"))
dev.off()
这使第二行(蛋白质)成为原点旁边的条。