我发布这是我的第一个问题,所以请耐心等待。我有这个数据框。
df <- data.frame(Class = c("Burkholderiales", "Burkholderiales", "Burkholderiales", "unclassified", "Burkholderiales", "Burkholderiales", "Rhodocyclales", "Burkholderiales", "Burkholderiales", "Burkholderiales", "Rhodocyclales", "Rhodocyclales", "Burkholderiales", "Rhodocyclales", "Rhodocyclales", "Rhodocyclales", "Burkholderiales", "Rhodocyclales", "Rhodocyclales", "Rhodocyclales", "Burkholderiales", "Burkholderiales", "Burkholderiales", "Burkholderiales", "Rhodocyclales", "Rhodocyclales", "Burkholderiales", "Rhodocyclales", "Burkholderiales", "Rhodocyclales"),
Genus = c("unclassified", "unclassified", "unclassified", "unclassified", "unclassified", "unclassified", "unclassified", "unclassified", "unclassified", "Paucibacter", "Dechloromonas", "unclassified", "unclassified", "unclassified", "Dok59", "Dechloromonas", "Hydrogenophaga", "Dechloromonas", "Uliginosibacterium", "Propionivibrio", "Hydrogenophaga", "unclassified", "Hydrogenophaga", "unclassified", "Sulfuritalea", "Dechloromonas", "unclassified", "Propionivibrio", "unclassified", "Dechloromonas"))
我使用此代码制作了一个情节
library("ggplot2")
ggplot(df, aes(x = Class, fill = Genus)) +
geom_bar() +
coord_flip()
它看起来像这样
我想要对图例进行细分,以便t具有类的名称,并且在下面它具有每个属的每种颜色。例如,它可能看起来像两个传说,一个用于Rhodocyclales,一个用于Burkholderiales,其中有相应的属和颜色。如果可能的话,我想保持颜色的顺序。这可能与ggplot2一起使用吗?
答案 0 :(得分:0)
这是我过去使用过的解决方法。它并不完美,仍需要一些调整,但至少它可以根据需要分离图例。假设你有如上定义的data.frame df,这里有一种分割图例的方法。
library(ggplot2)
library(plyr)
library(gtable)
library(gridExtra)
p_list <- dlply(df, .(Class), function(x) {
library(ggplot2)
x$Genus <- format(x$Genus, width=30)
ggplot(aes(x = Class, fill = Genus), data=x) +
geom_bar() + coord_flip() + ylim(0, 15) +
scale_x_discrete(labels=function(x) format(x, width = 30))
})
grob_list <- llply(p_list, ggplotGrob)
grid.arrange(grob_list[[1]], grob_list[[2]], grob_list[[3]], ncol=1)
还有两个问题:
颜色可能不匹配图,因此不同图中的相同属可能会有不同的颜色。您可以尝试使用Genus字段的因子,因此每个图中的类别都相同。
由于现在传说和x轴标签位于不同的图中,因此对齐两个图表有点棘手。我通过格式函数调用设置一个恒定的宽度来添加一些缓冲区。但是,正如您所看到的,图表x轴仍未正确对齐。
我不得不承认,过去这些问题对我来说有点单调乏味,所以我会留给你弄清楚。 stackoverflow中有一个问题可以解决这些其他问题。