快速帮助创建堆积条形图(ggplot2)

6

I have the following data frame:

> DF
年份 指标 MWh
2003 需求量 498343
2004 需求量 1250904
2005 需求量 1665176
2006 需求量 2317643
2007 需求量 2455311
2008 需求量 3557987
2009 需求量 4268125
2010 需求量 5403704
2011 需求量 6596158
2012 需求量 7814387
2013 需求量 9008863
2014 需求量 10291085
2015 需求量 11796549
2003 实际值 159677
2004 实际值 192748
2005 实际值 248844
2006 实际值 372661
2007 实际值 705656
2008 实际值 838721
2009 实际值 1188242
2010 实际值 1708979
2011 实际值 0
2012 实际值 0
2013 实际值 0
2014 实际值 0
2015 实际值 0
2003 最高值 0
2004 最高值 0
2005 最高值 0
2006 最高值 0
2007 最高值 0
2008 最高值 0
2009 最高值 0
2010 最高值 0
2011 最高值 3631730
2012 最高值 5729024
2013 最高值 6741785
2014 最高值 9342798
2015 最高值 11094798
2003 最低值 0
2004 最低值 0
2005 最低值 0
2006 最低值 0
2007 最低值 0
2008 最低值 0
2009 最低值 0
2010 最低值 0
2011 最低值 1637220
2012 最低值 1850615
2013 最低值 2064011
2014 最低值 2277406
2015 最低值 2490801

我想创建一个非常简单的堆积条形图,其中:
- x轴:年份
- y轴:MWh
- 1个堆栈包含Demand、High、Low和Actual(“Metric”),按照这个顺序相互叠加(而不是在上面)。到目前为止,我只能找出如何将值叠放在彼此上方:

DF$'Metric <- factor(DF$'Metric',levels=c("Demand","High","Low","Actual"))

qplot(x=Year,data=DF,geom="bar",weight=MWh,fill=Metric)
#OR
ggplot(DF,aes(x=factor(Year),y=MWh,fill=factor(Metric))) + geom_bar(position="stack")

本质上,我正在寻找每年一个单一的条形图,在这个图中,“Demand”值最高,较低的值(按照上述顺序)叠放在其上。我认为我必须在某个地方使用position="fill",但我不确定该放在哪里。基本上,我试图展示需求将稳步增长,而供应(实际与预测的低增长和高增长)无法在一个非常简单、紧凑的图形中满足它。如果这不可能,也许将它们并排放置会更好?
非常感谢您的帮助!谢谢!


1
我没有时间检查,但你可能正在寻找 position="identity" - Aniko
@Aniko:非常感谢!!!这正是我在寻找的!!干杯!!顺便问一下,我如何用勾号标记您的答案? - Ray
你不能将评论作为答案接受。我已经将其写成了一个答案。 - Aniko
2个回答

17

我不确定你想绘制什么,但从position="fill"来看,我有一个印象,你想绘制每年度的指标相对比例。可以通过以下方式轻松完成。

加载数据:

DF <- dput(DF)
structure(list(Year = c(2003L, 2004L, 2005L, 2006L, 2007L, 2008L, 
2009L, 2010L, 2011L, 2012L, 2013L, 2014L, 2015L, 2003L, 2004L, 
2005L, 2006L, 2007L, 2008L, 2009L, 2010L, 2011L, 2012L, 2013L, 
2014L, 2015L, 2003L, 2004L, 2005L, 2006L, 2007L, 2008L, 2009L, 
2010L, 2011L, 2012L, 2013L, 2014L, 2015L, 2003L, 2004L, 2005L, 
2006L, 2007L, 2008L, 2009L, 2010L, 2011L, 2012L, 2013L, 2014L, 
2015L), Metric = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("Demand", 
"High", "Low", "Actual"), class = "factor"), MWh = c(498343L, 
1250904L, 1665176L, 2317643L, 2455311L, 3557987L, 4268125L, 5403704L, 
6596158L, 7814387L, 9008863L, 10291085L, 11796549L, 159677L, 
192748L, 248844L, 372661L, 705656L, 838721L, 1188242L, 1708979L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 3631730L, 
5729024L, 6741785L, 9342798L, 11094798L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 1637220L, 1850615L, 2064011L, 2277406L, 2490801L)), .Names = c("Year", 
"Metric", "MWh"), row.names = c(NA, -52L), class = "data.frame")

并使用相同的高度(以百分比表示)绘制堆叠条形图:

ggplot(DF,aes(x=factor(Year),y=MWh,fill=factor(Metric))) + 
    geom_bar(position="fill")

enter image description here

我可能误解了您想绘制的内容,同时在同一张图片上绘制两个不同的图表也是通过指定网格视口实现的。我建议查看gridextra包,特别是arrange函数。


4

position="identity" 不会移动条形图(与默认堆叠相反),因此它们将重叠。不过,您需要注意因子水平的顺序,因为这样条形图可能会互相遮挡。

 ggplot(DF,aes(x=factor(Year),y=MWh,fill=factor(Metric))) + geom_bar(position="identity")

这个很好用,但如果有很多日期怎么办?有没有更好的方法来组织y轴上的日期? - george willy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接