一、简介:
ggplot2是R语言中很受欢迎的一个画图package,使用起来非常友好。ggplot2的实现得益于Leland Wilkinson在他的著作《The Grammar of Graphics》中提出了一套图形语法,把图形元素抽象成可以自由组合的成分,Hadley Wickham把这套想法在R中实现。Hadley Wickham有本专门讲ggplot2的书------ggplot2: 数据分析与图形艺术,感兴趣可以阅读。
这里有一个入门PPT------30分钟学会ggplot2.pdf,大家可以查看;
二、准备工作:
1)安装R软件(必选):http://www.r-project.org,先选择镜像,再下载;
2)安装RStudio(可选):http://www.rstudio.com/products/rstudio/,RStudio是一个应用广泛的IDE,功能强大友好,建议安装;
3)加载ggplot2(必选):打开R,在命令行中输入:install.packages("ggplot2"),会让你选择镜像后自动安装;在脚本中调用该包的时候,需要先加载该包,输入library(ggplot2) 即可;
三、ggplot2基本概念:
1)映射:
将数据中的变量映射到图形属性,如以下数据(表一),将trt这列映射为颜色(表二),显示效果如图一所示;
命令为:
data = data.frame(length=c(2,1,4,5), width=c(3,2,5,6), trt=c('a','a','b','b')) p = ggplot(data, aes(length, width, col=trt)) p + geom_point()
表一:
length | width | trt |
2 | 3 | a |
1 | 2 | a |
4 | 5 | b |
5 | 6 | b |
表二:
length | width | colour |
---|---|---|
2 | 3 | a |
1 | 2 | a |
4 | 5 | b |
5 | 6 | b |
图一:
2)标度(scale):
标度负责映射后图形显示的方式,具体来说就是图例和坐标刻度,即映射后对应的具体的值,如表二中的数据,实际对应的标度如:
length | width | colour |
---|---|---|
25 | 20 | red |
0 | 0 | red |
75 | 60 | blue |
100 | 80 | blue |
3)几何对象:
所对应的函数均以“geom_”开头,表示在图形中看到的点、线等形状;
散点图命令如“1) 映射”中所示,折线图命令如下:
data = data.frame(length=c(2,1,4,5), width=c(3,2,5,6), trt=c('a','a','b','b')) p = ggplot(data, aes(length, width, col=as.factor(1))); p + geom_line()
图二:
4)统计变换:
函数以“stat_”开头,指对原始数据进行某些计算,比如在散点图中加入回归线,只需用p + stat_smooth()即可加入回归线:
命令为:
num = 50 x = rnorm(num, 3, 3) y = 2*x + 1 + rnorm(num, sd=2) data = data.frame(x, y) p = ggplot(data, aes(x, y)) p + geom_point() + stat_smooth(method = 'lm')
效果如下,图中阴影为置信度为0.95的区间范围:
图三:
5)图层:
如图一、图二所示的散点图、折线图都是一个图层,在ggplot中图层可以叠加在一起显示:
命令:
data = data.frame(length=c(2,1,4,5), width=c(3,2,5,6), trt=c('a','a','b','b')) p = ggplot(data, aes(length, width)); p + geom_line() + geom_point(aes(col=trt, size=3))
图四:
四、案例:
按照如下程序,产生随机数据:
#该数据的含义是从7月1日至7月7日,每天有若干队提交成绩,这些队分属于A组或B组,
#最终看每天A组、B组的成绩箱线图,比较到底哪组成绩更好
num = 6 #表示共统计6天的成绩 set.seed(0) days = sample(20, num) #每天有若干队提交成绩,取值1至20的随机数 dates = paste('0', 701:(701 + num), sep='') dates2 = NULL for(i in 1:num) { dates2 = c(dates2, rep(dates[i], days[i])) #生成每个队提交成绩的日期 } num2 = sum(days) score = runif(num2, 0, 1) #生成每天每个队的成绩 flag = sample(c('A','B'), num2, replace=T) #生成每个队属于A组或B组 test_data = data.frame(date = dates2, score = score, flag = flag)
数据格式为:
> head(test_data) date score flag 1 0701 0.89838968 A 2 0701 0.94467527 A 3 0701 0.66079779 B 4 0701 0.62911404 A 5 0701 0.06178627 B 6 0701 0.20597457 A
如何用ggplot2画出 A、B两组成绩在日期0701—0706这六天的对比情况呢?
试试下面的命令:
p = ggplot(test_data, aes(date, score)) p2 = p + geom_boxplot(aes(fill = factor(flag))) p2
可以得到很靓丽的结果(如下图),在这个例子中 ggplot2 简单、益用、图形布局漂亮的特点可谓一览无余。