ggplot2使用感受

来源:互联网 发布:蟑螂药哪种最好用 知乎 编辑:程序博客网 时间:2024/05/20 14:39

转自http://blog.sina.com.cn/s/blog_6bb07f8301013vyf.html


最近学了一段ggplot2,总体感受是入门慢,但是功能确实强大。

还是推荐看原版的ggplot2 Elegant Graphics for DataAnalysis。其实不需要看完,看完1-3章,基本上就能够掌握原理,再看看常用绘图的代码就能搞定。个人感觉如果对图没有太复杂要求,ggplot2中的qplot函数完全可以胜任,并且qplot相对比ggplot2更容易学一点。

周末听了R语言大会,有一个议题是“30分钟学会ggplot”,对ggplot有了点更深的认识:
ppt网址:cos.name/2012/05/5th-china-r-beijing-summary/
1.每个点都有自己图像上的属性,比如x坐标,y坐标,点的大小、颜色和形状,这些都叫做aesthetics,即图像上可观测到的属性,通过aes函数来赋值,如果不赋值,才采用R的内置默认参数
2.ggplot先做mapping,设定画图对象的x和y坐标,以及点的颜色、形状,其描述对象的方式都是数据类型(通过aes来设定参数),然后再做scaling,把映射的数据转化为图形语言,如转化为像素大小。
3.geom决定了图像的“type”,即几何特征,是用点来描述图像,还是用柱,或者用条形?
4.关于变量问题,ggplot函数中赋予的值是全局性质的,如果不希望全局生效,放到后面+对应的图层中去
如:
CASE1:stat_smooth对不同颜色的点,各自拟合曲线
p<- ggplot(mpg,aes(x=hwy,y=cty,color=cyl))
p +geom_point()+ stat_smooth()

CASE2:stat_smooth对所有点,拟合一条曲线
p<- ggplot(mpg,aes(x=hwy,y=cty))
p +geom_point()+ stat_smooth(aes(color=cyl))
5.每一个统计变化都内置一个几何对象,每一个几何对象都内置一个统计变换
比如
散点图,几何对象是点,统计变换:无
直方图,几何对象是条形,统计变换:stat_bin(按照区间统计频数)



附录:常用命令图【不断补充中】,使用R的ggplot2包中自带的数据mpg,数据示意如下:
 
mpg[1:10,]
 
 manufacturer     model displ yearcyl     trans drv cty hwy fl  class
        audi        a4   1.81999   auto(l5)  18  29  p compact
        audi        a4   1.81999   4manual(m5)  21  29  p compact
        audi        a4   2.02008   4manual(m6)  20  31  p compact
        audi        a4   2.02008   auto(av)  21  30  p compact
        audi        a4   2.81999   auto(l5)  16  26  p compact
        audi        a4   2.81999   6manual(m5)  18  26  p compact
        audi        a4   3.12008   auto(av)  18  27  p compact
        audi a4 quattro   1.81999   4manual(m5)  18  26  p compact
        audi a4 quattro   1.81999   auto(l5)  16  25  p compact
10 
       audi a4 quattro   2.02008   4manual(m6)  20  28  p compact

1.点图
p<- ggplot(mpg,aes(x=hwy,y=cty))
p +geom_point()
以hwy为x坐标,cty为y坐标,每个样本对应一个点,将点绘制到图上,如果需要限制x坐标轴或者y坐标轴范围,使用xlim和ylim

比如:p+ geom_point()+ xlim(0, 3) 表示限定x坐标轴范围为0-3

衍生一点,可以不同类型画不同记号(shape)/颜色(color),比如:
p<-ggplot(mpg, aes(x=hwy, y=cty, shape=drv))
p+geom_point()

2.直方图
p<- ggplot(mpg,aes(x=hwy))
p +geom_histogram()
绘制hwy变量对应的直方图,纵坐标为count,如果希望纵坐标为密度,可以改成
p<- ggplot(mpg,aes(x=hwy,y=..density..))
p +geom_histogram()
注意density表示y坐标用密度而不是用默认count来代替,density前后都用..标出的原因是为了避免和dataframe中已有的列名有重复。这样表示赋值并不是dataframe中的列名含义,而是系统的参数含义

如果希望不同的年份绘制不同的图(每个年份一个直方图),可以采用facet_wrap参数
p +geom_histogram()+facet_wrap(~year, ncol=1), ncol表示排列方式为每行1个图或者:p+geom_histogram()+facet_grid(year~.) 注意:这里的year如果改成factor(year),会报错:
At least one layer must contain all variables used for facetting
3. 图像标签的加法: +opts(title="xxx")

4. 图像保存方法:ggsave(plot=, filename=)
plot填写图像对象,filename为保存的文件名

5. 共用同一个坐标,绘制不同的y值,非常简单,只需要将y的data赋值放到后面的geom语句中,例如:
横坐标为year,希望同时绘制cty,hwy在同一个图形中
ggplot(mpg,aes(x=year))+geom_line(aes(y=cty))+geom_line(aes(y=hwy))

6.ggplot貌似不支持不同的列向量画在不同的图里面(只支持按照某一个列向量分组画到不同的图里),有两种方法解决。(感谢暴君祥子和祝文祥beta的方法)
(1)调用grid函数先设置画布,再将图像画上去
例子:
library(ggplot2)
library(grid)

vplayout <- function(x, y) viewport(layout.pos.row =x, layout.pos.col = y)
plot1 <-qplot(mtcars,x=wt,y=mpg,geom="point",main="Scatterplot of wt vs.mpg")
plot2 <-qplot(mtcars,x=wt,y=disp,geom="point",main="Scatterplot of wt vsdisp")

grid.newpage()
pushViewport(viewport(layout = grid.layout(1, 2)))
print(plot1, vp = vplayout(1, 1))
print(plot2, vp = vplayout(1, 2))

(2)利用ggplot2的facet_grid功能,先对data做变形,从n行变成kn行,并增加一个列向量给与不同的标记,再用facet_grid函数关于该列向量分面画
例子:
library(ggplot2)
library(reshape2)
set.seed(32)
dat <- data.frame(id=LETTERS[1:10],
 
                 = 1:10,
 
                y1 = rnorm(10),
 
                y2 = rnorm(10),
 
                y3 = rnorm(10)
 
                )
# convert to long format
datl <- melt(dat, id.vars=c("id", "x"))
ggplot(datl, aes(x=x, y=value)) + geom_point() +facet_grid(variable ~ .)