【问题标题】:Getting a stacked area plot in R在R中获取堆积面积图
【发布时间】:2011-06-29 03:49:52
【问题描述】:

这个问题是我之前问的question的延续。

现在我有一个案例,其中还有一个带有 Prop 的类别列。所以,数据集变得像

Hour  Category        Prop2

00     A            25
00     B            59
00     A            55
00     C            5
00     B            50
...
01     C            56
01     B            45
01     A            56
01     B            35
...
23     D            58
23     A            52
23     B            50
23     B            35
23     B            15

在这种情况下,我需要在 R 中制作一个堆积面积图,其中包含每天这些不同类别的百分比。所以,结果会是这样的。

        A         B       C        D
00     20%       30%     35%       15% 
01     25%       10%     40%       25%
02     20%       40%     10%       30% 
.
.
.
20 
21
22     25%       10%     30%       35%
23     35%       20%     20%       25%

所以现在我会得到每个类别在每个小时内的份额,然后绘制这是一个像这样的堆积面积图,其中 x 轴是小时,y 轴是不同类别给出的每个类别的 Prop2 百分比颜色

【问题讨论】:

  • 我会说这是一个相当幸运的案例(197)... ;-)

标签: r plot ggplot2 reshape stacked-area-chart


【解决方案1】:

您可以使用 Hadley Wickham 的 ggplot2 包。

R> library(ggplot2)

一个示例数据集:

R> d <- data.frame(t=rep(0:23,each=4),var=rep(LETTERS[1:4],4),val=round(runif(4*24,0,50)))
R> head(d,10)
   t var val
1  0   A   1
2  0   B  45
3  0   C   6
4  0   D  14
5  1   A  35
6  1   B  21
7  1   C  13
8  1   D  22
9  2   A  20
10 2   B  44

然后您可以将ggplotgeom_area 一起使用:

R> ggplot(d, aes(x=t,y=val,group=var,fill=var)) + geom_area(position="fill")

【讨论】:

  • 谢谢,但是如何从初始表中获取每个类别每小时的份额(百分比或比率)到您在此处的数据集“d”中显示的表格?
  • 对不起,我没有从你的问题中看到这一点。事实上,我认为 ggplot2 可以为您做到这一点:我已经编辑了我的帖子以展示如何做到这一点。
  • 抱歉再次打扰您仍然对数据进行了简化,在初始形式中,每个小时都会重复类别。所以,在第 0 小时可能有多行类别 A,那么我如何首先汇总每个小时的每个类别,以使其成为您在此处显示的形式?
【解决方案2】:

您可以使用plotrix 包中的stackpoly

library(plotrix)
#create proportions table
pdat <- prop.table(xtabs(Prop2~Hour+Category,Dat),margin=1)
#draw chart
stackpoly(pdat,stack=T,xaxlab=rownames(pdat))
#add legend
legend(1,colnames(pdat),bg="#ffffff55",fill=rainbow(dim(pdat)[2]))

【讨论】:

  • 这似乎可行,并给了我堆栈图,但没有传说可以说明哪个彩色堆栈代表哪个类别?
  • 您需要先对类别进行排序,以便知道哪个是哪个,然后使用 legend() 命令制作自己的图例。
  • @sfactor 添加了一个示例图例,请阅读?legend 了解有关其工作原理的更多详细信息
【解决方案3】:

如果你想去掉边界,你可以这样使用 scale_x_discretecoord_cartesian

 p <- ggplot(d, aes(x=Date,y=Volume,group=Platform,fill=Platform)) + geom_area(position="fill")
 base_size <- 9
 p + theme_set(theme_bw(base_size=9)) + scale_x_discrete(expand = c(0, 0)) +  coord_cartesian(ylim=c(0,1))

【讨论】:

  • 对我来说,这会将整个图表组合在一起,只占据右侧绘图区域的一小部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-20
  • 1970-01-01
  • 1970-01-01
  • 2011-01-15
  • 1970-01-01
  • 2021-03-19
相关资源
最近更新 更多