geom="point"
可以绘制散点图。这是当你指定了x和y参数给qplot()
时默认的设置;
geom="smooth"
将拟合一条平滑曲线,并将曲线和标准误展示在图中;
geom="boxplot"
可以绘制箱线胡须图,用以概括一系列点的分布情况;
geom="path"
和geom=“line"
可以在数据点之间绘制连线。这类图传统的作用是探索时间和其他变量之间的关系,但连线同样可以用其他的方式将数据点连接起来。线条图只能创建从左到右的连线,而路径图则可以是任意的方向。
对于一维的分布,几何对象的选择是由变量的类型指定的:
对于连续变量,geom="histogram"
绘制直方图,geom="freqpoly"
绘制频率多边形,geom="density"
绘制密度曲线。如果只有x参数传递给qplot()
,那么直方图几何对象就是默认的选择;
对于离散变量,geom="bar"
用来绘制条形图。
重量与价格的散点图中加入了平滑曲线。上图为dsmall数据集,下图为完整数据集。
qplot(carat, price, data = dsmall, geom = c("point", "smooth"))
qplot(carat, price, data = diamonds, geom = c("point", "smooth"))
曲线的平滑程度是由span
参数控制的,其取值范围是从0(很不平滑)到1(很平滑)
上图是 span=0.2
,下图是 span=1
qplot(carat, price, data = dsmall, geom = c("point", "smooth"), span = 0.2)#平滑度
qplot(carat, price, data = dsmall, geom = c("point", "smooth"), span = 1)
你可以使用method="gam"
,formula=y~s(x)
来调用mgcv
包拟合一个广义可加模型。这与在lm
中使用样条相类似,但样条的阶数是通过数据估计得到的。
对于大数据,请使用公式formula=y~s(x,bs='cs')
,这是数据量超过1000时默认使用的选项。
在运用广义可加模型作为平滑器时 formula
参数的作用。
上图是formula=y~s(x)
,下图是 formula=y~s(x,bs='cs')
。
library(mgcv)
qplot(carat, price, data = dsmall, geom = c("point", "smooth"), method = "gam", formula = y ~ s(x))
qplot(carat, price, data = dsmall, geom = c("point", "smooth"), method = "gam", formula = y ~ s(x, bs = "cs"))
#数据量超过1000时使用第二个
在运用线性模型作为平滑器时 formula
参数的作用。
上图是 formula=y~x
的默认值,下图是 formula=y~ns(x, 5)
library(splines)
qplot(carat, price, data = dsmall, geom = c("point", "smooth"), method = "lm")
qplot(carat, price, data = dsmall, geom = c("point", "smooth"), method = "lm", formula = y ~ ns(x, 5))
#5是自由度,自由度越大,曲线波动越大
利用扰动点图(上)和箱线图(下)来考察以颜色为条件的每克拉价格的分布。
随着颜色的改变(从上到下),每克拉价格的跨度逐渐减小,但分布的中位数没有明显的变化。
qplot(color, price/carat, data = diamonds, geom = "jitter")
qplot(color, price/carat, data = diamonds, geom = "boxplot")
每一种方法都有它的优势和不足。箱线图只用了5个数字对分布进行概括,而扰动点图可以将所有的点都绘制到图中(当然会有图形重叠的问题)。
在本例中,两种图形都显示出每克拉价格的跨度与钻石颜色是相关的,但箱线图的信息更充分,它显示出分布的中位数和四分位数都没有太大的变化。
扰动点图中的图形重叠问题可以通过半透明颜色来部分解决,也就是使用alpha
参数。下图展示了三种水平的透明度,这使得我们可以更清楚地看出数据集中的地方。这三张图是用如下的代码生成的:
改变 alpha
的取值,从上到下分别为 1/5,1/50 和 1/200。随着不透明度的降低,我们可以看出数据集中的地方。然而,箱线图依然是一个更好的选择。
qplot(color, price/carat, data = diamonds, geom = "jitter", alpha = I(1/5))
qplot(color, price/carat, data = diamonds, geom = "jitter", alpha = I(1/50))
qplot(color, price/carat, data = diamonds, geom = "jitter", alpha = I(1/200))
扰动点图不能像箱线图那样显示出四分位数的位置,但它体现了箱线图所不能展示的其他一些分布特征。
对于扰动点图来说,qplot
可以提供像一般的散点图那样对其他图形属性的控制,例如size
,colour
和shape
。
对于箱线图,你可以用colour
控制外框线的颜色,用fill设置填充颜色,以及用size
调节线的粗细。
另外一种考察条件分布的方法是用分面来作出分类变量的每一个水平下连续变量的直方图或密度曲线,这在后面的内容会进行介绍。
展示钻石重量的分布。
上图使用的是 geom='histogram'
右图使用的是 geom=' density'
qplot(carat, data = diamonds, geom = "histogram")
qplot(carat, data = diamonds, geom = "density")
对于密度曲线图而言,adjust
参数控制了曲线的平滑程度(adjust取值越大,曲线越平滑)。对于直方图,binwidth
参数通过设定组距来调节平滑度。(切分位置同样可以通过breaks
参数进行显式的指定。)
绘制直方图或密度曲线时,对平滑程度进行试验非常重要。在直方图中,你应该尝试多种组距:当组距较大时,图形能反映数据的总体特征;当组距较小时,则能显示出更多的细节。
qplot(carat, data = diamonds, geom = "histogram", binwidth = 1, xlim = c(0, 3))
qplot(carat, data = diamonds, geom = "histogram", binwidth = 0.1, xlim = c(0, 3))
qplot(carat, data = diamonds, geom = "histogram", binwidth = 0.01, xlim = c(0, 3))
变动直方图的组距可以显示出有意思的模式。从上到下,组距分别为1,0.1 和 0.01。只有重量在 0 到 3 克拉之间的钻石显示在图中。
要在不同组之间对分布进行对比,只需要再加上一个图形映射,如下面的代码所示。
当一个分类变量被映射到某个图形属性上,几何对象会自动按这个变量进行拆分。
上图是重叠的密度曲线图,下图是堆叠起来的直方图。
qplot(carat, data = diamonds, geom = "density", colour = color)
qplot(carat, data = diamonds, geom = "histogram", fill = color)
密度曲线图在第一眼看来更吸引人,因为它似乎很容易阅读,而且适于在不同的曲线之间进行比较。然而,要真正理解密度曲线的含义则比较困难,而且密度曲线有一些隐含的假设,例如曲线应该是无界、连续和平滑的,而这些假设不一定适用于真实的数据。
钻石颜色的条形图。上图显示的是分组的计数,下图是按 weight=carat进行加权,展示了每种颜色的钻石的总重量。
qplot(color, data = diamonds, geom = "bar")
qplot(color, data = diamonds, geom = "bar", weight = carat) + scale_y_continuous("carat")
线条图和路径图常用于可视化时间序列数据。线条图将点从左到右进行连接,而路径图则按照点在数据集中的顺序对其进行连接(线条图就等价于将数据按照x取值进行排序,然后绘制路径图)。线条图的x轴一般是时间,它展示了单个变量随时间变化的情况。路径图则展示了两个变量随时间联动的情况,时间反映在点的顺序上。
由于钻石数据中没有包含时间变量,因此在这里我们使用economics
数据集,它包含了美国过去40年的经济数据。
下图展示了失业水平随时间变化的两张线条图,它们是用geom="line"
进行绘制的。
第一张图显示了失业率的变化,第二张图是失业星期数的中位数。
我们已经可以看出这两个变量之间的一些区别,例如在最后的一个峰值处,失业的比例要比前一个峰值低,但失业的时间却要更长。
qplot(date, unemploy/pop, data = economics, geom = "line")
qplot(date, uempmed, data = economics, geom = "line")
衡量失业程度的两张时序图:
上图是失业人口的比例,下图是失业星期数的中位数;
图形是用 geom='line'
进行绘制的。
要考察这种关系的更多细节,我们可以将两个时间序列绘制在同一张图中。尽管我们可以用一张散点图来表示失业率和失业时间长度之间的关系,但我们并不能从中看出变量随时间的变化。对此,解决的办法是将临近时点的散点连接起来,形成一张路径图。
在下面我们画出了失业率和失业时间长度随时间变化的路径。由于线条有很多交叉,因此在第一张图中时间变化的方向并不明显。在第二张图中,我们将年份映射到了colour
属性上,这让我们能更容易地看出时间的行进方向。
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))