从数据框列表中绘制数据

Plot data from data frame list

我有一个数据框列表,

>head(df.list.xyg[["archae.list"]])
motif obs pred prop stat pval stdres 
AAB 1189 760.1757 0.05556028 11811.94    0 16.00425
CDD 1058 249.7147 0.01825133 11811.94    0 51.62291 
DDE 771 415.1314 0.03034143 11811.94    0 17.73730
FBB 544 226.3529 0.01654385 11811.94    0 21.28994

>head(df.list.xyg[["eukaryote.list"]])
motif obs pred prop stat pval stdres 
ABG 82015 48922.33 0.08773749 321891.7    0 156.64562
GBC 51601 64768.42 0.11615591 321891.7    0 -55.03402
AGG 41922 30136.56 0.05404701 321891.7    0  69.80141
CGG 25545 14757.24 0.02646569 321891.7    0  90.00215
BTT 15795 12433.58 0.02229843 321891.7    0  30.48747

我愿意

四处搜索后,以下代码片段完成了部分工作。它只绘制最后一个数据集。我假设它正在“覆盖”早期的数据集。我该如何解决?这可以通过 face_wrap 或 facet_grid 实现吗?

myplots<-lapply(df.list.xyg,
                function(x)
                  p<-ggplot(x,aes(x=motif,y=stdres)) +
                  geom_bar(stat="identity",width=0.5, color="blue", fill="gray")
)
print (myplots)

如果您只是希望这些图一起出现在一个绘图中 window,您可以使用分面。您可以将数据框的行与 dplyr::bind_rows 绑定在一起,这将创建一个 id 列来标记每行属于哪个数据框。我们通过这个 ID 变量分面。

library(ggplot2)

ggplot(dplyr::bind_rows(df.list.xyg, .id = "Kingdom"), aes(motif, stdres)) +
  geom_col(width = 0.5, fill = "deepskyblue4") +
  geom_hline(yintercept = 0, color = "gray75") +
  facet_grid(.~Kingdom) +
  theme_bw(base_size = 16)

如果您的列表中有很多不同的数据框,facet_grid 可能比 facet_wrap 更好。

根据您希望如何呈现数据,您可能更愿意使用 lapply

中的 ggsave 将单个图保存到文件中

取自问题的可重现数据

df.list.xyg <- list(archae = structure(list(motif = c("AAB", 
"CDD", "DDE", "FBB"), obs = c(1189L, 1058L, 771L, 544L), 
pred = c(760.1757, 249.7147, 
415.1314, 226.3529), prop = c(0.05556028, 0.01825133, 0.03034143, 
0.01654385), stat = c(11811.94, 11811.94, 11811.94, 11811.94), 
    pval = c(0L, 0L, 0L, 0L), stdres = c(16.00425, 51.62291, 
    17.7373, 21.28994)), class = "data.frame", row.names = c(NA, 
-4L)), eukaryote.list = structure(list(motif = c("ABG", "GBC", 
"AGG", "CGG", "BTT"), obs = c(82015L, 51601L, 41922L, 25545L, 
15795L), pred = c(48922.33, 64768.42, 30136.56, 14757.24, 12433.58
), prop = c(0.08773749, 0.11615591, 0.05404701, 0.02646569, 0.02229843
), stat = c(321891.7, 321891.7, 321891.7, 321891.7, 321891.7), 
    pval = c(0L, 0L, 0L, 0L, 0L), stdres = c(156.64562, -55.03402, 
    69.80141, 90.00215, 30.48747)), class = "data.frame", row.names = c(NA, 
-5L)))

reprex package (v2.0.1)

于 2022-05-23 创建

@allancameron:优雅的解决方案!谢谢。那么关键就是row-bind,这样数据就可以根据王国facet-wrapped了。我修改了代码如下

  • 在单个 column-two 行中绘制
  • 根据数据范围缩放y-axis
  • 将 y-axis 标签旋转 90 度以获得更好的可读性。
library(ggplot2)

ggplot(dplyr::bind_rows(df.list.xyg, .id = "Kingdom"), aes(motif, stdres)) +
  geom_col(width = 0.5, fill = "deepskyblue4") +
  geom_hline(yintercept = 0, color = "gray75") +
  facet_grid(Kingdom ~ ., scales = "free") +
  theme_bw(base_size = 16)