转自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<-
p +geom_point()+ stat_smooth()
CASE2:stat_smooth对所有点,拟合一条曲线
p<-
p +geom_point()+ stat_smooth(aes(color=cyl))
5.每一个统计变化都内置一个几何对象,每一个几何对象都内置一个统计变换
比如
散点图,几何对象是点,统计变换:无
直方图,几何对象是条形,统计变换:stat_bin(按照区间统计频数)
附录:常用命令图【不断补充中】,使用R的ggplot2包中自带的数据mpg,数据示意如下:
1
2
3
4
5
6
7
8
9
10
1.点图
p<-
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<-
p +geom_histogram()
绘制hwy变量对应的直方图,纵坐标为count,如果希望纵坐标为密度,可以改成
p<-
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],
# convert to long format
datl <- melt(dat, id.vars=c("id", "x"))
ggplot(datl, aes(x=x, y=value)) + geom_point() +facet_grid(variable ~ .)