星期四, 一月 19, 2012

ggplot2绘图入门系列之三:位置调整与条形图

位置调整(Position adjustments)是针对同一图层内元素的位置进行微调的方法。它包括五种设置,分别是stack、dodge、fill、identity、jitter。

我们用条形图来展示其用法,仍使用mpg数据集,其中用到的变量是class,即生产汽车的类型,以及year生产年份。下面的条形图是将各类型的汽车数量进行汇集,并以年份作为分组变量。我们首先载入扩展包,然后用频数表对数据进行大致的了解,最后绘制了四种条形图。
library(ggplot2)
with(mpg,table(class,year))
p <- ggplot(data=mpg,aes(x=class,fill=factor(year)))
p + geom_bar(position='dodge')
p + geom_bar(position='stack')
p + geom_bar(position='fill')
p + geom_bar(position='identity',alpha=0.3)
 





可以看到dodge方式是将不同年份的数据并列放置;stack方式是将不同年份数据堆叠放置,这也是geom_bar的默认处理方式;fill方式和stack类似,但Y轴不再是计数,而是以百分比显示;identity方式是不做任何改变直接显示出来,所以需要设置透明度才能看得清楚。

geom_bar是绘制条状几何对象,所以也可以用不经汇集的原始数据进行绘图。下面我们用2001到2010年间的美国GDP增长率举个例子。

y=c(1.1,1.8,2.5,3.6,3.1,2.7,1.9,-0.1,-3.5,3.0)
x=2001:2010
data=data.frame(x,y)
p=ggplot(data,aes(x,y,fill=y))
p+geom_bar(stat="identity")+ 
    geom_abline(intercept = 0, slope = 0,size=1,colour='gray')+
    geom_text(aes(label=y),hjust=0.5, vjust=-0.5 )+
    scale_y_continuous(limits=c(-3.8,4.2))+
    labs(x='年份', y='GDP增长率%')+
    opts(title = "美国GDP增长率")


5 条评论:

  1. 你好,最近在学习r,发现了你的blog,十分喜欢。今天参考你的这篇博文学习ggplot,想请教下这个with 和 table到底是怎么使用的
    还有提取出来的这个表格
    year
    class 1999 2008
    2seater 2 3
    compact 25 22
    midsize 20 21
    minivan 6 5
    pickup 16 17
    subcompact 19 16
    suv 29 33
    是一个list还是一个什么?如果我想直接由数据生成,类似的应该怎么做?

    回复删除
    回复
    1. 你好,table是一个生成二维频率表的函数,它会自动为落在两个变量中的样本计数。为了能直接操作data.frame中的变量,所以需要用到with函数,如果不用with的话,可以这么弄:table(mpg$class,mpg$year)

      提取中的表格是一种table格式,你可以通过class函数来了解任何一个对象的属性。

      不明白你说的直接由数据生成是什么意思?生成什么东西?

      删除
    2. 我昨天继续看了下,year和class是dimensionname,平时一般只有colname和rowname所以没弄明白。
      我是想知道,怎么给data.frame添加dimensionname。我一会查看看,应该就找到了。
      非常感谢

      删除
  2. 你好,文章写得很不错,但是再联系 美国GDP增长率的例子中,有个问题报错
    Warning message:
    Stacking not well defined when ymin != 0
    在win7 x64 环境 ,ggplot2的版本是0.9.3.1
    y=c(1.1,1.8,2.5,3.6,3.1,2.7,1.9,-0.1,-3.5,3.0)
    x=2001:2010
    data=data.frame(x,y)
    p=ggplot(data,aes(x,y,fill=y))
    p+geom_bar(stat="identity")+
    geom_abline(intercept = 0, slope = 0,size=1,colour='gray')+
    geom_text(aes(label=y),hjust=0.5, vjust=-0.5 )+
    scale_y_continuous(limits=c(-3.8,4.2))+
    ggtitle( "美国GDP增长率")

    回复删除
  3. warning 是没有关系的,还是可以运行出来。因为ggplot2包更新了一些函数,这个文章可能有点老了。

    回复删除