如何融化 R data.frame 并按条形图绘制组

Posted

技术标签:

【中文标题】如何融化 R data.frame 并按条形图绘制组【英文标题】:How to melt R data.frame and plot group by bar plot 【发布时间】:2014-12-08 08:08:06 【问题描述】:

我有以下 R data.frame:

  group match unmatch unmatch_active match_active
1   A    10       4              0            0
2   B   116      20              0            3
3   c   160      27              1            4
4   D    79      17              0            3
5   E   309      84              4           14
6   F   643     244             10           23
...

我的目标是按条形图(http://www.cookbook-r.com/Graphs/Bar_and_line_graphs_(ggplot2)/ 具有更多变量的截面图)绘制一个组,如链接所示。

我意识到在开始之前我需要将数据转换为以下格式

  group variable value
1   A    match    10
2   B    match   116
3   C    match   160
4   D    match    79
5   E    match   309
6   F    match   643
7   A    unmatch   4
8   B    unmatch  20
...

我使用了融化功能:

groups.df.melt <- melt(groups.df[,c('group','match','unmatch', 'unmatch_active', 'match_active')],id.vars = 1)

我认为我没有正确地进行融化,因为在我执行上述 groups.df.melt 后有 1000 多行,这对我来说没有意义。

我查看了Draw histograms per row over multiple columns in R 的方法并尝试遵循相同的方法,但我没有得到我想要的图表。

此外,我收到以下错误:当我尝试进行绘图时:

ggplot(groups.df.melt, aes(x='group', y=value)) + geom_bar(aes(fill = variable), position="dodge") + scale_y_log10()

Mapping a variable to y and also using stat="bin".
  With stat="bin", it will attempt to set the y value to the count of cases in each group.
  This can result in unexpected behavior and will not be allowed in a future version of ggplot2.
  If you want y to represent counts of cases, use stat="bin" and don't map a variable to y.
  If you want y to represent values in the data, use stat="identity".
  See ?geom_bar for examples. (Deprecated; last used in version 0.9.2)
Error in pmin(y, 0) : object 'y' not found

【问题讨论】:

after I execute above groups.df.melt has 1000+ lines which doesn't make sense to me 为什么这没有意义?如果您的 data.table 中有 200 行或更多行,那么当融合到 5 列中时,您将拥有 1000 多行。 你在 ggplot2 行中的错误只是你有x='group' 而不是x=group 【参考方案1】:

试试:

mm <- melt(ddf, id='group')
ggplot(data = mm, aes(x = group, y = value, fill = variable)) + 
       geom_bar(stat = 'identity', position = 'dodge')

ggplot(data = mm, aes(x = group, y = value, fill = variable)) + 
       # `geom_col()` uses `stat_identity()`: it leaves the data as is.
       geom_col(position = 'dodge')

【讨论】:

以上是关于如何融化 R data.frame 并按条形图绘制组的主要内容,如果未能解决你的问题,请参考以下文章

如果使用融化的 data.table,如何使用 ggplot2 向条形图添加标签?

R堆叠条形图与组

在R中改变ggplot中组的顺序

如何在百分比条形图上方添加百分比或计数标签?

R数据可视化:如何绘制条形图?

用R中的线条连接条形图