【问题标题】:Frequency data frame for grouped bar plot分组条形图的频率数据框
【发布时间】:2018-05-23 17:22:45
【问题描述】:

我正在尝试使用 ggplot2(但可能是其他包)创建分组条形图。我意识到还有其他几个类似的帖子,但是我找不到任何可以回答我的具体问题的帖子,所以,如果它看起来多余,我深表歉意。搜索其他问题和答案,我生成了以下代码:

### To remove unwanted rows from the larger data set###

NestPatch=NestPatch[,c(3,34)]

### Reshape data frame ####

dfm <- melt(NestPatch[,c("VOR2Binned", "Factor")],id.vars = 1)

我希望 VOR2Binned 在 X 轴上,Frequency 在 Y 轴上,VOR2Binned 按因子变量(0 或 1)分组,我想将其重命名为 Used 和 Random。

这是我的示例数据:

Factor VOR2Binned   

0   3
1   3
0   3
1   3
0   2
1   2
1   3
0   2
1   3
0   2
0   3
1   3
0   3
1   3
0   3
1   3
1   2
0   3
0   0

使用上面的代码,我最终得到了以下有序数据框。

VOR2Binned   variable   value

0   Factor  0
0   Factor  0
0   Factor  0
0   Factor  0
0   Factor  0
2   Factor  1
2   Factor  0
2   Factor  0
2   Factor  0
2   Factor  1
2   Factor  0
2   Factor  0
2   Factor  0
2   Factor  0
2   Factor  0
2   Factor  0
3   Factor  0
3   Factor  1
3   Factor  1

如果我继续

    #### Plot ####
   ggplot(dfm,aes(x = VOR2Binned,y = variable)) + 
  geom_bar(aes(fill = value),stat = "identity",position = "dodge") + 
  scale_y_log10()

我得到“评估错误(expr,envir,enclos):找不到对象'因子'”。

我想我错过了开发每个 VOR2Binned 类的频率的步骤。

【问题讨论】:

  • 您能否提供一个可重现的示例?至少,您应该提供str() 的数据。 MWE 将帮助您了解您的数据集以及您可能存在不足的地方。
  • 我很抱歉我缺乏理解,但想提供足够的信息。什么是 MWE?在这个平台上提供数据的 str() 的最佳方式是什么?

标签: r


【解决方案1】:

如果您不介意使用 data.table...

# generate your sample data
require(data.table)
dt <- data.table(structure(list(
Factor = c(0L, 1L, 0L, 1L, 0L, 1L, 1L, 0L, 1L, 0L, 0L, 1L, 0L, 1L, 0L, 
1L, 1L, 0L, 0L), VOR2Binned = c(3L, 3L, 3L, 3L, 2L, 2L, 3L, 2L, 3L, 2L, 
3L, 3L, 3L, 3L, 3L, 3L, 2L, 3L, 0L)), .Names = c("Factor","VOR2Binned"), 
row.names = c(NA, -19L), class = c("data.table", "data.frame")))

# count occurrences for each VOR2Binned
dt[, Frequency := .N, by=.(VOR2Binned, Factor)]

# let's make sure column Factor is really a factor
dt$Factor <- as.factor(dt$Factor)
# change name to Used and Available
levels(dt$Factor) <- c("Used", "Available")

# let's ggplot it!
ggplot(dt) + geom_col(aes(VOR2Binned, Frequency, fill=Factor),
                       position="dodge")

【讨论】:

  • 谢谢,效果很好。有什么理由不使用 data.frame 吗?我之所以这么问,是因为用户“baci”给出答案的方式。
  • 我猜不是,只是计数频率使用了 data.table 特有的 .N。如果您使用其他方法计算频率,那么其余代码应该可以正常工作。
【解决方案2】:

好的,当然,经过几个小时的工作,我在发布问题后不久就找到了另一种方法。

dfm <- melt(NestPatch[,c("VOR2Binned", "Factor")],id.vars = 3)
dfm <-with(NestPatch, table(VOR2Binned, Factor)) 
tbl <- with(NestPatch, table(Factor, VOR2Binned)); barplot(tbl, beside = TRUE, legend = TRUE) 

Used Available Plot

我错过了构建数据表的步骤。

现在这足以可视化数据,但如果有人可以提供帮助,我仍然想弄清楚如何使用 ggplot 来完成。此外,如果有人知道如何将图例从当前的因子代码 1 和 0 修改为已使用和可用,将不胜感激。提前致谢。

【讨论】:

  • 作为另一个跟进,是否有一种简单的方法可以将 Y 轴修改为百分比或在每个条形上方设置观察百分比?
猜你喜欢
  • 2018-01-24
  • 1970-01-01
  • 2021-12-27
  • 2018-12-22
  • 2013-10-09
  • 1970-01-01
  • 2020-01-07
  • 1970-01-01
  • 2021-03-30
相关资源
最近更新 更多