简介
本章所用的数据集为ggplot2包中的diamonds数据集,这一章主要涉及qplot的用法,qplot的意思是quick plot,即快速制图。
基本用法
library(ggplot2)
head(diamonds) # 查看数据集前5列
## carat cut color clarity depth table price x y z
## 1 0.23 Ideal E SI2 61.5 55 326 3.95 3.98 2.43
## 2 0.21 Premium E SI1 59.8 61 326 3.89 3.84 2.31
## 3 0.23 Good E VS1 56.9 65 327 4.05 4.07 2.31
## 4 0.29 Premium I VS2 62.4 58 334 4.20 4.23 2.63
## 5 0.31 Good J SI2 63.3 58 335 4.34 4.35 2.75
## 6 0.24 Very Good J VVS2 62.8 57 336 3.94 3.96 2.48
set.seed(1000) # 设置随机种子,这个数据不固定,随便设,方便重复
dsmall <- diamonds[sample(nrow(diamonds),100),] # nrow(diamonds)表示diamonds这个数据集的行数,sample(x,100)表示从x中随机取100个样本
str(dsmall) # 查看数据结构
## 'data.frame': 100 obs. of 10 variables:
## $ carat : num 1.23 0.3 0.9 0.31 0.31 1.01 0.5 0.34 0.92 1.01 ...
## $ cut : Ord.factor w/ 5 levels "Fair"<"Good"<..: 5 5 2 5 5 5 1 5 5 2 ...
## $ color : Ord.factor w/ 7 levels "D"<"E"<"F"<"G"<..: 5 2 5 4 4 3 2 5 1 2 ...
## $ clarity: Ord.factor w/ 8 levels "I1"<"SI2"<"SI1"<..: 4 3 4 7 4 1 3 5 2 3 ...
## $ depth : num 62.2 61.7 61.9 62.8 61.5 62.2 66.5 62.1 61.9 58.1 ...
## $ table : num 55 58 58 57 56 54 58 57 55 59 ...
## $ price : int 7130 499 3989 977 652 3439 1098 765 5051 5627 ...
## $ x : num 6.81 4.29 6.14 4.33 4.34 6.44 4.87 4.51 6.24 6.57 ...
## $ y : num 6.85 4.3 6.18 4.3 4.36 6.42 4.9 4.48 6.27 6.65 ...
## $ z : num 4.25 2.65 3.81 2.71 2.68 4 3.25 2.79 3.87 3.84 ...
qplot(carat,price,data = diamonds) # 绘制价格(price)与克拉(carat)的散点图
qplot(log(carat),log(price),data = diamonds) # 对价格(price)与克拉(carat)做对数变换后的散点图
qplot(carat, x*y*z, data = diamonds) # 对克拉(carat)与体积(x*y*z)做散点图
分类变量对应的颜色、大小、形状等属性
qplot中有各种表示分类变量的属性,例如颜色,大小等。可以将数据集中的分类变量与之相应匹配。
str(dsmall) # 再查看一下数据结构
## 'data.frame': 100 obs. of 10 variables:
## $ carat : num 1.23 0.3 0.9 0.31 0.31 1.01 0.5 0.34 0.92 1.01 ...
## $ cut : Ord.factor w/ 5 levels "Fair"<"Good"<..: 5 5 2 5 5 5 1 5 5 2 ...
## $ color : Ord.factor w/ 7 levels "D"<"E"<"F"<"G"<..: 5 2 5 4 4 3 2 5 1 2 ...
## $ clarity: Ord.factor w/ 8 levels "I1"<"SI2"<"SI1"<..: 4 3 4 7 4 1 3 5 2 3 ...
## $ depth : num 62.2 61.7 61.9 62.8 61.5 62.2 66.5 62.1 61.9 58.1 ...
## $ table : num 55 58 58 57 56 54 58 57 55 59 ...
## $ price : int 7130 499 3989 977 652 3439 1098 765 5051 5627 ...
## $ x : num 6.81 4.29 6.14 4.33 4.34 6.44 4.87 4.51 6.24 6.57 ...
## $ y : num 6.85 4.3 6.18 4.3 4.36 6.42 4.9 4.48 6.27 6.65 ...
## $ z : num 4.25 2.65 3.81 2.71 2.68 4 3.25 2.79 3.87 3.84 ...
可以发现,color是因子类型的,可以用"颜色"属性将其区别开:
qplot(carat, price, data = dsmall, colour = color)
qplot(carat, price, data = dsmall, colour = color)这条命令就表示用颜色属性将数据集中的颜色分类区别开,再看一个例子,用形状将切工(cut)类型区别开:
qplot(carat, price, data = dsmall, shape = cut)
其实,也可以用颜色将切工(cut)区别开:
qplot(carat, price, data = dsmall, colour = cut)
原理都一样,即一个数据集中的分类变量可以对应qplot中相应的分类属性(例如颜色是可以区分的,形状也可以是区分的,这些都能代表一种分类)。
图形透明度
可以用I()来控制图形的透明度,可以看以下例子:
# install.packages("gridExtra") # 要用到grid.arrange()这个函数,需要安装这个包
library(gridExtra)
## Loading required package: grid
x1 <- qplot(carat, price, data = diamonds, alpha = I(1/10))
#alpha= I(1/10)用于控制透明度,ggplot2_2_6
x2 <- qplot(carat, price, data = diamonds, alpha = I(1/100))
x3 <- qplot(carat, price, data = diamonds, alpha = I(1/200))
x4 <- qplot(carat, price, data = diamonds, alpha = I(1/400))
grid.arrange(x1, x2, x3,x4)
几何对象
这一部分用前面的dsmall数据集。
qplot(carat, price, data = dsmall) # 简单的散点图
接着,在简单的散点图上加上平滑曲线:
qplot(carat, price, data = dsmall, geom = c("point", "smooth")) # 简单的散点图加上了平滑曲线,geom = c("point", "smooth")表示将points用smooth连接起来
换成原始数据集diamonds的效果:
qplot(carat, price, data = diamonds, geom = c("point", "smooth"))
在取消了误差范围时的平滑曲线:
qplot(carat, price, data = dsmall, se=FALSE,geom = c("point", "smooth"))
在添加曲线时,还有其他的参数可以使用,method="loess",当n比较小时是默认选项,用局部回归的方法。曲线的平滑程度由span控制,范围是[0,1],如下所示:
p1 <- qplot(carat, price, data = dsmall, geom = c("point", "smooth"), span =0)
p2 <- qplot(carat, price, data = dsmall, geom = c("point", "smooth"), span =0.2)
p3 <- qplot(carat, price, data = dsmall, geom = c("point", "smooth"), span =0.6)
p4 <- qplot(carat, price, data = dsmall, geom = c("point", "smooth"), span =1)
grid.arrange(p1,p2,p3,p4)
箱线图与扰动点图
扰动点图
j1 <- qplot(color, price/carat, data = diamonds, geom = "jitter", alpha =I(1/5))
# geom为设定图形类型,jitter为扰动点图,ggplot2_2_18
# jitter是绘图扰动图的参数,alpha = I(1/5)用于控制透明度
j2 <- qplot(color, price/carat, data = diamonds, geom = "jitter", alpha =I(1/50))
j3 <- qplot(color, price/carat, data = diamonds, geom = "jitter", alpha =I(1/200))
j4 <- qplot(color, price/carat, data = diamonds, geom = "boxplot", alpha =I(1/5))
grid.arrange(j1,j2,j3,j4)
直方图与密度曲线图
h1 <- qplot(carat, data = diamonds, geom = "histogram")+xlab("直方图")
#直方图
h2 <- qplot(carat, data = diamonds, geom = "density")+xlab("密度曲线图")
#密度曲线图
h3 <- qplot(carat, data = diamonds, geom = "density",adjust = 1)+xlab("密度曲线图adjust = 1")
#adjust控制曲线的平滑程度,数值越大,越平滑,默认为1
h4 <- qplot(carat, data = diamonds, geom = "density",adjust = 2)+xlab("密度曲线图adjust = 2")ust控制曲线的平滑程度,数值越大,越平滑
grid.arrange(h1,h2,h3,h4)
可以通过改变组距的方式来调节图形的平滑度,参数为binwidth:
d1 <- qplot(carat, data = diamonds, geom = "histogram", binwidth = 1, xlim =c(0,3))
d2 <- qplot(carat, data = diamonds, geom = "histogram", binwidth = 0.1, xlim = c(0,3))
d3 <- qplot(carat, data = diamonds, geom = "histogram", binwidth = 0.01,xlim = c(0,3))
grid.arrange(d1,d2,d3,ncol=3, nrow=1)
分类变量映射到图形属性中的结果:
qplot(carat, data = diamonds, geom = "density", colour = color )
#colour把分类变量映射到颜色属性上
qplot(carat, data = diamonds, geom = "histogram", fill = color)
# 把color变量映射到填充属性上:
条形图:
qplot(color, data = diamonds, geom = "bar") # 只计算各种颜色的数量,注意y轴的标签
以颜色为x轴,以克拉数为y轴绘制图形:
qplot(color, data = diamonds, geom = "bar", weight = carat)+scale_y_continuous("carat")
#weight为加权平均值,scale_y_continuous("carat")表示y轴是连续型变量
时间序列中的线条图和路径图
以economics数据集为例演示,此数据集包含了美国过去1967-2007年间的数据,如下所示:
head(economics)
## date pce pop psavert uempmed unemploy
## 1 1967-06-30 507.8 198712 9.8 4.5 2944
## 2 1967-07-31 510.9 198911 9.8 4.7 2945
## 3 1967-08-31 516.7 199113 9.0 4.6 2958
## 4 1967-09-30 513.3 199311 9.8 4.9 3143
## 5 1967-10-31 518.5 199498 9.7 4.7 3066
## 6 1967-11-30 526.2 199657 9.4 4.8 3018
date是时间,uempmed是失业星期数的中位数,unemploy是失业人数,pop是人数(不清楚单位)
第一张图:失业率随时间的变化:
qplot(date, unemploy/pop, data = economics, geom = "line")
第二张图:失业星期数的中位数随时间的变化:
qplot(date, uempmed, data = economics, geom = "line")
加入时间变量后的图形:
year <- function(x) as.POSIXlt(x)$year + 1900
qplot(unemploy / pop, uempmed, data = economics, geom = c("point", "path"))
qplot(unemploy / pop, uempmed, data = economics, geom = "path", colour =year(date))
qplot(unemploy / pop, uempmed, data = economics, geom = c("point", "path"),colour = year(date))
解释一下:
- 在上面的一段命令中,as.POSIXlt()表示的是以1900年为界,将日期类型的数据转化为POSIXlt格式,as.POSIXlt(x)$year是将其中的年份减去1900后剩余的,因此,第一行要加一个1900,其中数据后面带CST,意思是标准时间。第一行构建了一个函数,这个函数的意思是提取日期类型中的年。
- 第二行命令,是以失业率为x轴,失业星期数的中位数为y轴绘图,并且将其中的点用路径连接起来,因此用到的参数是geom = c("point", "path")。
- 第三行命令,区别是加了colour = year(date),意思是把年份变量映射到颜色上。
- 第四行命令,与第三行的区别是去掉了点,只要路径。
分面
qplot(carat, data = diamonds, facets = color ~ ., geom = "histogram",binwidth = 0.1, xlim = c(0,3))#ggplot2_2_37,facets = color ~ . 以颜色为条件的直方图
上面命令表示,以克拉(carat)为x轴,以颜色(color)为分面的参数,即把不同的颜色放到不同的直方图中,用到的参数为facets = color~.,其中的最小组距设置为0.1,即binwidth=0.1,x轴的范围为[0,3]。
另外的例子:
qplot(carat, ..density.., data = diamonds, facets = color ~., geom ="histogram", binwidth = 0.1, xlim = c(0,3))
这个例子与第一个不同之处于在用到了..density..(注意前后有两点半角逗号),表示ggplot2把密度(上一个例子是频数)映射到y轴。
分面的其他选项
这一部分涉及到图形的一些外观参数,与plot()函数中的类似,有xlim,ylim,log,main,xlab,ylab: 第1个例子:基础
qplot(
carat, price, data = dsmall, # 用到的数据集是dsmall,以price为x轴,以carat为y轴绘图
xlab = "Price ($)", ylab = "Weight(carat)", # x轴的标签是Price ($),y轴的标签是Weight(carat)
main = "Price-weight relationship" # 标题是Price-weight relationship
)
第2个例子:用到了数学表达式
qplot(
carat, price/carat, data = dsmall,
ylab = expression(frac(price, carat)), # 用到了数学表达式ylab = expression_r(frac(price, carat))表示y轴的标签是个分数,分母是carat,分子是price
xlab = "Weight(carats)",
main = "Small diamonds",
xlim = c(0.2, 1)
)
## Warning in loop_apply(n, do.ply): Removed 27 rows containing missing
## values (geom_point).
第3个例子:取对数
qplot(carat, price, data = dsmall,log="xy") #log="x"表示对x轴取对数,log="xy"表示对x轴和y轴都取对数
#log = "xy"表示对xy轴都取对数