R数据可视化-ggplot2中的qplot函数

qplot()是ggplot2的一个作图函数,qplot的意思是快速作图(quick plot)。

数据集

本文的所有绘图使用的都是ggplot2内置的diamonds数据集,便于我们聚焦于作图的细节。

diamonds数据集包含了约54000颗钻石的价格和质量的信息。

数据说明:

  • 反映钻石质量的四个“C”
    • 克拉重量:carat
    • 切工:cut
    • 颜色:color
    • 净度:clarity
  • 五个物理指标
    • 深度:depth
    • 钻面宽度:table
    • x
    • y
    • z
1
str(diamonds)
1
2
3
4
5
6
7
8
9
10
11
Classes 'tbl_df', 'tbl' and 'data.frame':	53940 obs. of  10 variables:
$ carat : num 0.23 0.21 0.23 0.29 0.31 0.24 0.24 0.26 0.22 0.23 ...
$ cut : Ord.factor w/ 5 levels "Fair"<"Good"<..: 5 4 2 4 2 3 3 3 1 3 ...
$ color : Ord.factor w/ 7 levels "D"<"E"<"F"<"G"<..: 2 2 2 6 7 7 6 5 2 5 ...
$ clarity: Ord.factor w/ 8 levels "I1"<"SI2"<"SI1"<..: 2 3 5 4 2 6 7 3 4 5 ...
$ depth : num 61.5 59.8 56.9 62.4 63.3 62.8 62.3 61.9 65.1 59.4 ...
$ table : num 55 61 65 58 58 57 57 55 61 61 ...
$ price : int 326 326 327 334 335 336 336 337 337 338 ...
$ x : num 3.95 3.89 4.05 4.2 4.34 3.94 3.95 4.07 3.87 4 ...
$ y : num 3.98 3.84 4.07 4.23 4.35 3.96 3.98 4.11 3.78 4.05 ...
$ z : num 2.43 2.31 2.31 2.63 2.75 2.48 2.47 2.53 2.49 2.39 ...
1
head(diamonds)
carat cut color clarity depth table price x y z
0.23 Ideal E SI2 61.5 55 326 3.95 3.98 2.43
0.21 Premium E SI1 59.8 61 326 3.89 3.84 2.31
0.23 Good E VS1 56.9 65 327 4.05 4.07 2.31
0.29 Premium I VS2 62.4 58 334 4.20 4.23 2.63
0.31 Good J SI2 63.3 58 335 4.34 4.35 2.75
0.24 Very Good J VVS2 62.8 57 336 3.94 3.96 2.48

下面我们从原始数据中随机选出100个样本作为新数据集dsmall,便于小数据的作图展示:

1
2
3
4
5
# 让样本可重复
set.seed(1410)

# 原始数据的一个容量为100的随机样本
dsmall <- diamonds[sample(nrow(diamonds),100),]

qplot()基本用法

基本用法

下面是钻石的价格和重量之间的关系:

1
2
3
4
5
6
7
8
9
10
# 基本用法-左图
qplot(carat, price, data = diamonds)

# 这种相关关系似乎是指数型的,因此我们应该先对变量进行一些变换。
# 变量的函数作为参数-中图
qplot(log(carat), log(price), data = diamonds)

# 变量的某种组合作为参数-右图
# 钻石的体积(`x * y * z`表示)和重量之间的关系
qplot(carat, x * y * z, data = diamonds)

颜色、大小、形状和其他图形属性

1
2
3
4
5
# 分组-颜色-左图
qplot(carat, price, data = dsmall, colour = color)

# 分组-形状-右图
qplot(carat, price, data = dsmall, shape = cut)

我们可以使用I()来手动设定图形属性。

例如:colour = I("red")size = I(2)

我们可以通过使用alpha图形属性来调整透明度,例如1/10,其分母表示经过多少次重叠之后颜色将变得不透明,这样我们可以看到大部分的点在哪里进行了重叠。

1
2
3
4
5
# 透明度设置为1/10-左图
qplot(carat, price, data = diamonds, alpha = I(1/10))

# 透明度设置为1/200-右图
qplot(carat, price, data = diamonds, alpha = I(1/200))

几何对象geom

我们可以通过改变几何对象画出任何一种类型的图形。

二维变量关系:

  • geom = "point":散点图(默认)
  • geom = "smooth":拟合一条平滑曲线
  • geom = "boxplot":箱线胡须图
  • geom = "path"geom = "line":数据点之间绘制连线

一维分布:

  • 连续变量
    • geom = "histogram":直方图(默认)
    • geom = "freqplot":频率多边形
    • geom = "density":密度曲线
  • 离散变量
    • geom = "bar":条形图

平滑曲线

如果散点图中有非常多的数据点,那么数据展示的趋势就不太明显了,这时候,我们可以在图中添加一条平滑曲线。

1
2
3
4
5
# 小数据集-左图
qplot(carat, price, data = dsmall, geom = c("point", "smooth"))

# 全部数据集-右图
qplot(carat, price, data = diamonds, geom = c("point", "smooth"))

我们可以通过span参数控制曲线的平滑程度。

1
qplot(carat, price, data = dsmall, geom = c("point", "smooth"), span = 0.2)

箱型图和扰动点图

当数据集包含了一个分类变量和一个连续变量时,我们可以通过箱型图和扰动点图来看连续变量是如何随着分类变量的变化而变化的。

  • 扰动点图可以显示所有的点,但是有图形重叠的问题。
  • 箱型图可以显示出分布的中位数和四分位数,信息更充分。
1
2
3
4
5
# 扰动点图-左图
qplot(color, price / carat, data = diamonds, geom = "jitter")

# 箱型图-右图
qplot(color, price / carat, data = diamonds, geom = "boxplot")

我们可以用半透明度来解决扰动点图的图形重叠问题。

1
2
3
4
5
6
7
8
# 透明度设置为1/5-左图
qplot(color, price / carat, data = diamonds, geom = "jitter", alpha = I(1/5))

# 透明度设置为1/50-中图
qplot(color, price / carat, data = diamonds, geom = "jitter", alpha = I(1/50))

# 透明度设置为1/200-右图
qplot(color, price / carat, data = diamonds, geom = "jitter", alpha = I(1/200))

直方图和密度曲线图

直方图和密度曲线图可以展示单个变量的分布。

1
2
3
4
5
# 直方图-左图
qplot(carat, data = diamonds, geom = "histogram")

# 密度曲线图-右图
qplot(carat, data = diamonds, geom = "density")

在直方图中,应该尝试多种组距。当组距较大时,图形能反映数据的总体特征,当组距较小时,则能显示出更多的细节

1
2
3
4
5
6
7
8
# 组距设置为1-左图
qplot(carat, data = diamonds, geom = "histogram", binwidth = 1)

# 组距设置为0.1-中图
qplot(carat, data = diamonds, geom = "histogram", binwidth = 0.1)

# 组距设置为0.01-右图
qplot(carat, data = diamonds, geom = "histogram", binwidth = 0.01)

如果要对不同组的分布进行对比,只需要再加上一个图形映射

1
2
3
4
5
# 密度图分组对比-左图
qplot(carat, data = diamonds, geom = "density", colour = color)

# 直方图分组对比-右图
qplot(carat, data = diamonds, geom = "histogram", fill = color)

条形图

条形图几何对象会计算每一个水平下观测的数量,因此无需预先对数据进行汇总。

下面是钻石颜色的条形图:

1
2
3
4
5
# 普通条形图(钻石颜色)-左图
qplot(color, data = diamonds, geom = "bar")

# 按重量加权的条形图,即得到的是每种颜色的钻石的总重量-右图
qplot(color, data = diamonds, geom = "bar", weight = carat) + scale_y_continuous("carat")

时间序列中的线条图和路径图

线条图和路径图常用于时间序列的可视化。

  • 线条图:点从左到右进行连接
  • 路径图:按照点在数据集中的顺序进行连接
1
str(economics)
1
2
3
4
5
6
7
Classes 'spec_tbl_df', 'tbl_df', 'tbl' and 'data.frame':	574 obs. of  6 variables:
$ date : Date, format: "1967-07-01" "1967-08-01" ...
$ pce : num 507 510 516 512 517 ...
$ pop : num 198712 198911 199113 199311 199498 ...
$ psavert : num 12.6 12.6 11.9 12.9 12.8 11.8 11.7 12.3 11.7 12.3 ...
$ uempmed : num 4.5 4.7 4.6 4.9 4.7 4.8 5.1 4.5 4.1 4.6 ...
$ unemploy: num 2944 2945 2958 3143 3066 ...
1
head(economics)
date pce pop psavert uempmed unemploy
1967-07-01 506.7 198712 12.6 4.5 2944
1967-08-01 509.8 198911 12.6 4.7 2945
1967-09-01 515.6 199113 11.9 4.6 2958
1967-10-01 512.2 199311 12.9 4.9 3143
1967-11-01 517.4 199498 12.8 4.7 3066
1967-12-01 525.1 199657 11.8 4.8 3018
1
2
3
4
5
# 失业人口的比例-左图
qplot(date, unemploy / pop, data = economics, geom = "line")

# 失业星期数的中位数-右图
qplot(date, uempmed, data = economics, geom = "line")

分面

比较不同分组可以通过

  • 图形属性(颜色和形状):所有组绘制在同一张图中
  • 分面:数据分割成若干子集,然后创建一个图形的矩阵,将每个子集绘制到图形矩阵中

下面第一张图展示的是频数,第二张图展示的是频率,频率图可以使得比较不同组的分布时不受到该组样本量大小的影响:

1
2
3
4
5
6
7
# 钻石重量的频数(按照颜色分组)-左图
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))

语法说明:

  • 我们可以通过row_var ~ col_var的表达式进行指定窗格数。如果想指定一行或一列,可以使用.作为占位符
  • ..density..:这是一个新的语法,告诉ggplot2将密度而不是频数映射到y轴

其他选项

qplot中还有以下选项用于控制图形的外观:

  • xlim、ylim:设置x轴和y轴的显示区间。例如:xlim = c(0, 20)
  • log:一个字符型向量,说明哪个坐标轴应该取对数。例如:log = "xy"
  • main:图形的主标题,可以是字符串或表达式。例如:main = "plot title"main = expression(beta[1] == 1)
  • xlab、ylab:设置x轴和y轴的标签文字,可以是字符串或表达式。
1
2
3
4
5
6
7
8
9
# 标题、坐标轴标签设置-左图
qplot(
carat, price, data = dsmall,
xlab = "Price ($)", ylab = "Weight (carats)",
main = "Price-weight relationship"
)

# 坐标轴设置为对数-右图
qplot(carat, price, data = dsmall, log = "xy")

本文是《ggplot2-数据分析与图形艺术》的笔记


----------- 本文结束啦感谢您阅读 -----------

赞赏一杯咖啡

欢迎关注我的其它发布渠道