如何为数据框列表制作条形图?

Posted

技术标签:

【中文标题】如何为数据框列表制作条形图?【英文标题】:how to make a bar plot for a list of dataframes? 【发布时间】:2014-03-31 04:19:29 【问题描述】:

我有一个数据框列表,我想为每个数据框制作一个条形图。具体sum是条的高度,users是每个条的标签。

结果12

[[1]]
         users sum
1 00250902DC7D  34
2 00250902FA92  34
3 00250902FB05  34
4 002509030C41  34
5 002509030E53  34

[[2]]
         users sum
1 00250902DC7D  24
2 00250902FA92  24
3 00250902FB05  24
4 002509030C41  24
5 002509030E53  24

[[3]]
[1] times  users  signal mode   diff  
<0 rows> (or 0-length row.names)

[[4]]
         users sum
1 00250902DC7D   1
2 00250902FA92   1
3 00250902FB05   1
4 002509030C41   1
5 002509030E53  71  

输入(结果 12) 列表(结构(列表(用户 = 结构(c(1L,3L,4L,10L,13L),.Label = c(“00250902DC7D”, “00250902FA91”、“00250902FA92”、“00250902FB05”、“00250902FB2E”、 “00250902FE0A”、“00250902FE63”、“002509030AD2”、“002509030B9D”、 “002509030C41”、“002509030C8D”、“002509030CE4”、“002509030E53”、 "002509030E63"), class= "因子"), sum = c(34, 34, 34, 34, 34 )), .Names = c("users", "sum"), row.names = c(NA, -5L), class= "data.frame"), 结构(列表(用户 = 结构(c(1L,3L,4L,10L,13L),.Label = c(“00250902DC7D”, “00250902FA91”、“00250902FA92”、“00250902FB05”、“00250902FB2E”、 “00250902FE0A”、“00250902FE63”、“002509030AD2”、“002509030B9D”、 “002509030C41”、“002509030C8D”、“002509030CE4”、“002509030E53”、 "002509030E63"), class= "因子"), sum = c(24, 24, 24, 24, 24)), .Names = c("users", "sum"), row.names = c(NA, -5L), class= "data.frame"), 结构(列表(次 = 结构(数字(0),class= c(“POSIXct”, "POSIXt"), tzone = ""), users = structure(integer(0), .Label = c("00250902DC7D", “00250902FA91”、“00250902FA92”、“00250902FB05”、“00250902FB2E”、 “00250902FE0A”、“00250902FE63”、“002509030AD2”、“002509030B9D”、 “002509030C41”、“002509030C8D”、“002509030CE4”、“002509030E53”、 “002509030E63”),class= “因子”),信号 = 结构(整数(0),.Label = c(“假”, “真”),class=“因子”),模式=结构(整数(0),.Label = c(“关闭”, "ON"), class= "因子"), diff = numeric(0)), .Names = c("times", “用户”、“信号”、“模式”、“差异”)、row.names = 整数(0)、class= “data.frame”)、 结构(列表(用户 = 结构(c(1L,3L,4L,10L,13L),.Label = c(“00250902DC7D”, “00250902FA91”、“00250902FA92”、“00250902FB05”、“00250902FB2E”、 “00250902FE0A”、“00250902FE63”、“002509030AD2”、“002509030B9D”、 “002509030C41”、“002509030C8D”、“002509030CE4”、“002509030E53”、 "002509030E63"), class= "因子"), sum = c(1, 1, 1, 1, 71 )), .Names = c("users", "sum"), row.names = c(NA, -5L), class= "data.frame"))

如何自动生成我的条形图?

【问题讨论】:

是的,它不起作用。可能我写错了代码 我的错。请看我的回答。 【参考方案1】:

您可以使用 reshape2 包中的 melt() 来重塑数据。然后你可以使用ggplot2 来制作条形图。

require(reshape2)
require(ggplot2)
pino2=melt(pino,id.vars=c('users','sum'))

ggplot(pino2,aes(x=factor(users),y=sum))+geom_bar(stat='identity')+
facet_grid('L1~.')

L1 是输入列表的编号,所以这就是分组依据(如果我理解正确的话)。如果您不想这样做,请不要在 ggplot 行的末尾插入+ facet_grid('L1~.')

【讨论】:

我曾尝试mel,但失败了,错误:Error: id variables not found in data: sum 第七个元素可能会造成问题,因为它没有维度。尝试设置pino[[7]]=NULL 你还需要去掉 pino[[3]],因为它也是空的。这不起作用,我不确定你应该做什么,因为这些数据集中总是有名为“sum”的列。 请检查我修改后的答案。它对我有用。 @user1362215 谢谢你,完美。基本上我需要两个 【参考方案2】:

您需要先从列表中删除空数据框。

> res <- result12[sapply(result12, dim)[1,] != 0]
> res
[[1]]
         users sum
1 00250902DC7D  34
2 00250902FA92  34
3 00250902FB05  34
4 002509030C41  34
5 002509030E53  34

[[2]]
         users sum
1 00250902DC7D  24
2 00250902FA92  24
3 00250902FB05  24
4 002509030C41  24
5 002509030E53  24

[[3]]
         users sum
1 00250902DC7D   1
2 00250902FA92   1
3 00250902FB05   1
4 002509030C41   1
5 002509030E53  71

然后使用

查看所有内容(在 pdf 文档中)
> pdf("result12.pdf")
> lapply(1:length(res), function(i)
    barplot(res[[i]]$sum, names.arg = res[[i]]$users)
  )
> dev.off()

【讨论】:

我试过了,还是不行...:&gt; lapply(1:length(result12), function(i) barplot(result12[[i]]$sum, names.arg = result12[[i]]$users))Error in result12[[i]]$sum : $ operator is invalid for atomic vectors Result12Pino 的较短版本。我已经修改了我的初始问题以使其更方便 我已经修改过了。您需要先从列表中删除空数据框。 是的,但它只创建一个关于最后一个数据帧 result12[[4]] 的图。 好的,但它显示所有图的速度非常快......但它太快了......我需要清楚地看到它们

以上是关于如何为数据框列表制作条形图?的主要内容,如果未能解决你的问题,请参考以下文章

你如何为ggplot中的条形图在x轴上做范围?

在 SwiftUI 中,如何为条形图创建动态矩形?

如何为情况创建分组条形图[重复]

情节堆积条形图熊猫数据框

如何用两个类别制作条形图?

教你如何用Python制作花式条形图