本文使用的数据集为ggplot2包自带的diamonds数据集,其包含了约54000颗钻石的价格和质量的信息。这组数据涵盖了反映钻石质量的四个“C”——克拉重量(carat)、切工(cut)、颜色(color)和净度(clarity),以及五个物理指标——深度(depth)、钻石宽度(table)、x、y、z。如下图:
本文使用的另一个数据集是原始数据的一个容量为100的随机样本
set.seed(1410) #使样本可重复
dsmall<-diamonds[sample(nrow(diamonds),100),]
1 基本用法
格式:qplot(x,y,data=data1)
例:qplot(carat,price,data=diamonds)
qplot(log(carat),log(price),data=diamonds)
颜色、大小、形状和其他属性
qplot(carat,price,data=dsmall,colour=color)
qplot(carat,price,data=dsmall,shape=cut)
qplot(carat,price,data=diamonds,aplha=I(1/100))
2 几何对象geom
geom=”point” 可以绘制散点图
geom=”smooth” 将拟合一条平滑曲线,并将曲线和标准误展现在图中
geom=”boxplot” 可以绘制箱线胡须图,可以概括一系列点的分布情况
geom=”path” 和geom=”line” 可以在数据点之间绘制连线。线条图只能创建从左到右的连线,而路径图则可以是任意方向。
对于一维的分布,几何对象的选择是由变量的类型指定的:
对于连续变量,geom=”histogram”绘制直方图,geom=”freqploy”绘制频率多边形,geom=”density”绘制密度曲线。
对于离散变量,geom=”bar”绘制条形图。
例:向图中添加平滑曲线
qplot(carat,price,data=dsmall,geom=c("point","smooth"))
qplot(carat,price,data=diamonds,geom=c("point","smooth"))
不绘制标准误差
qplot(carat,price,data=dsmall,geom=c("point","smooth"),se=FALSE)
method参数选择不同的平滑器(loess/gam/lm/rlm)
method=”loess”,当n较小时是默认选项,使用的是局部回归的方法。曲线的平滑程度是由span参数控制的,其取值范围是从0(很不平滑)到1(很平滑)
例:qplot(carat,price,data=dsmall,geom=c("point","smooth"),span=0.2)
Loess对于大数据并不十分适用,因此当n超过1000时,默认的是另一种平滑算法。
method=”gam”,formula=y~s(x)调用mgcv包拟合一个广义可加模型。对于大数据,可使用y~s(x,bs=”cs”),这是数据量超过1000时默认使用的选项。
method=”lm”拟合的是线性模型,默认情况下式一条直线,但可以指定formula=y~poly(x,2)来拟合一个二次多项式或加载splines包以使用自然样条:formula=y~ns(x,2)。第二个参数是自由度:自由度取值越大,曲线的波动也越大。
例:library(splines)
qplot(carat,price,data=dsmall,geom=c("point","smooth"),method="lm",formula=y~ns(x,5))
method=”rlm”采用的是更稳健的拟合算法,使结果对异常值不太敏感。这个方法是MASS包的一部分,运用前需加载MASS包。
箱线图和扰动图
如果一个数据集中包含了一个分类变量和一个或多个连续变量,以上两个图可以描绘连续变量会如何随着分类变量水平的变化而变化。
例:下图展示了钻石每克拉的价格随颜色的变化情况
qplot(color,price/carat,data=diamonds,geom="jitter")
qplot(color,price/carat,data=diamonds,geom="boxplot")
直方图和密度图
直方图和密度图可以展示单个变量的分布,如以下两图展示了钻石重量的直方图和密度图。
例:qplot(carat,data=diamonds,geom="density")
qplot(carat,data=diamonds,geom="histogram")
其中直方图可以通过设置binwidth参数设置组距的大小。
要在不同组之间对分布进行对比,只需要加上一个图形映射,如:
qplot(carat,data=diamonds,geom="density",colour=color)
qplot(carat,data=diamonds,geom="histogram",binwidth=0.1,xlim=c(0,3),fill=color)
条形图
在离散变量的情形下,条形题与直方图相类似,绘制的方法是geom=”bar”。条形图几何对象会计算每一水平下观测的数量,因此不需要预先对数据进行汇总。如果数据已经进行了汇总,或者想用其他的方式对数据进行分组处理(如对连续变量进行分组求和),可以使用weight几何对象。
例:左图是钻石颜色的普通条形图,右图是按重量加权的条形图
qplot(color,data=diamonds,geom="bar")
qplot(color,data=diamonds,geom="bar",weight=carat)+
scale_y_continuous("carat")
时间序列中的线条图和路径图
线条图的X轴一般是时间,展示的是单个变量随时间变化的情况,路径图则展示了两个变量随时间联动的情况,时间反映在点的顺序上。
使用economics数据集,它包含了美国过去40年的经济数据,左图展示了失业率的变化,右图表示失业星期数的中位数。
qplot(date,unemploy/pop,data=economics,geom="line")
qplot(date,uempmed,data=economics,geom="line")
下图表示失业率和失业时间长度随时间的变化的路径。左图有很多交叉,时间变化的方向并不明显,右图中将年份映射到了colour属性属性上,时间的行进方向更明显。
qplot(unemploy/pop,uempmed,data=economics,geom=c("point","path"))
year<-function(x) as.POSIXlt(x)$year+1900
qplot(unemploy/pop,uempmed,data=economics,geom=c("point","path"),colour=year(date))
3 分面
之前利用利用图形属性(颜色和形状)来比较不同分组的方法,它可以将所有的组绘制在同一张图上。分面是另一种实现的方法:它将数据分割成若干子集,然后创建一个图形的矩阵,将每一个子集绘制到图形矩阵的窗格中。
qplot()默认的分面方面是将图形拆分成若干个窗格,这可以通过形如row_var-col_var的表达式进行指定。可以指定任意数量的行变量和列变量,但当变量数超过两个时,生成的图形可能非常大,以至于不适合在屏幕上显示。如果只想一行一列,可以使用.作为占位符,例如row_var~.会创建一个单列多行的图形矩阵。
例:以颜色为条件的重量的直方图,右图绘制的是比例,这使得比较不同组的分布时不会受到该组样本量大小的影响。
qplot(carat,data=diamonds,facets=color~.,geom="histogram",
binwidth=0.1,xlim=c(0,3))
qplot(carat,..density..,data=diamonds,facets=color~.,
geom="histogram",binwidth=0.1,xlim=c(0,3)
4 其他选项
qplot中还有一些其他的选项用于控制图形的外观。这些参数与在plot中的作用相同。
xlim,ylim:设置x轴和y轴的显示区间,例xlim=c(0,20)
log:一个字符型向量,说明哪一个座标轴应该取对数,例log=”x”表示对x轴取对数,log=”xy”表示对x轴和y轴都取对数。
main:图形的主题,参数可以是字符串,也可以是表达式
xlab,ylab:设置x轴和y轴的标签文字,可以是字符串或数学表达式
例:
qplot(
carat,price,data=dsmall,
xlab="price($)",ylab="weight(carats)",
main="price-weight relationship"
)