【问题标题】:ggplot: percentage counts line graph for factor groups on a scaleggplot:按比例计算因子组的百分比线图
【发布时间】:2014-03-20 15:46:49
【问题描述】:

假设我想在 ggplot 中绘制不同年龄组对某个问题的“是”答案的百分比。这些年龄组显然是因素,但我希望它们以类似比例的方式显示,所以想使用折线图。

这是一些数据:

mydata <- data.frame(
    age_group = c("young", "middle", "old"),
    question = sample(c("yes", "no"), 99, replace = TRUE))
mydata$age_group = factor(mydata$age_group,levels(mydata$age_group)[c(3, 1, 2)])  
mydata$question = factor(mydata$question,levels(mydata$question)[c(2,1)]) 

到目前为止,我一直在使用这段代码来生成堆叠条形图:

 ggplot(mydata, aes(age_group, fill = question)) +  geom_bar(position = "fill") 

如何将其更改为折线图,仅包含“是”答案的频率计数?答案中的标记提出了一种产生正确输出的解决方法:

但我希望有一种方法可以在一行代码中自动执行此操作,而不是先创建此汇总表。

【问题讨论】:

  • 我不明白。您只想要一个基本上连接粉色条顶部的折线图?

标签: r ggplot2


【解决方案1】:

如果我理解正确,这就是你想要的:

ggplot(mydata) + 
  stat_bin(aes(x=age_group, color=question, group=question), geom="line") 

请注意,在是/否方面,这看起来与您的不完全相同,因为您没有为随机数设置种子。

【讨论】:

  • 差不多,但我想要的是百分比,而不是绝对数。
  • @Danielle,您可以将geom=areacolor=question 更改为fill=question,添加position=fill,这将起作用,但将是面积图而不是折线图。不幸的是,我不知道如何堆叠和填充线条。
【解决方案2】:

如果您只想要每个类别的“是”百分比,我建议您将数据更改为以下内容:

  question age_group value   percent
1      yes     young    14 0.4242424
3      yes    middle    17 0.5151515
5      yes       old    20 0.6060606

使用此代码汇总数据:

library(reshape)
mydata.summary = melt(xtabs(~question+age_group,data=mydata))
mydata.summary2 = mydata.summary[mydata.summary$question=="yes",]
mydata.summary2$percent <- mydata.summary2$value/melt(xtabs(~age_group,data=mydata))$value
ggplot(mydata.summary2, aes(age_group,percent, group = question, colour=question)) + geom_line()

【讨论】:

  • 如果您添加 ) + geom_line() 我认为您的答案已被切断,则此方法有效。无论如何,作为一种解决方法,我一直在这样做,但这有点痛苦。我只是想知道是否有更有效的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-20
  • 1970-01-01
  • 2020-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多