这个主要是对《ggplot2数据分析与图形艺术》第五章相关练习题的总结
library(tidyverse)
ggplot2数据分析与图形艺术课后题:第二章
ggplot2数据分析与图形艺术课后题:第三章
ggplot2数据分析与图形艺术课后题:第五章
ggplot2数据分析与图形艺术课后题:第六章
ggplot2数据分析与图形艺术课后题:第七章
ggplot2数据分析与图形艺术课后题:第八章
5.3 数据
========
1. data和aes在不同函数当中的顺序区别
我们在使用ggplot2
绘图的时候,由于ggplot
参数是要提前指定图层的。所以需要指定所需要的数据。之后用来绘图的参数一般来说是基于ggplot
里面得到数据来绘图的,所以反而aes
则会更重要一些
2. 绘制目标图形
class <- mpg %>% group_by(class) %>% summarise(n = n(), hwy = mean(hwy))
head(class)
## # A tibble: 6 x 3
## class n hwy
##
## 1 2seater 5 24.8
## 2 compact 47 28.3
## 3 midsize 41 27.3
## 4 minivan 11 22.4
## 5 pickup 33 16.9
## 6 subcompact 35 28.1
解析一下目标图形,
在mpg数据集里面绘制以
class
为横坐标,以hwy
为纵坐标的震荡图在class数据集,同样绘制
相关坐标系的点图。同时把点的大小放大。为了好看也可以设置一下颜色和透明度。在y = 10的地方添加每一组的一个样本统计。
适当的调整Y轴范围
ggplot(data = mpg, aes(class, hwy)) + geom_jitter() + geom_point(data = class, size = 5, alpha = 0.5, color = "red") + geom_text(data = class, aes(label = paste0("n = ",n)), y = 10) + ylim(10, 45)
5.4 图层映射
============
1. 简化图形
- 我们在进行图层映射的时候,如果目标数据来源是映射的数据集,那么可以直接写列名即可。
ggplot(mpg) + geom_point(aes(displ, hwy))
- 如果多个绘图函数都是是有相同的数据集和映射。那么只需要在前面指定一次即可
ggplot(mpg, aes(cty, hwy)) + geom_point() + geom_smooth()
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
- 在做图的时候需要确定目标数据集,如果是无用的数据集不需要进行设定
ggplot() + geom_point(aes(log(brainwt), log(bodywt)), data = msleep)
## Warning: Removed 27 rows containing missing values (geom_point).
2.示例图形有用没
试运行示例代码
ggplot(mpg) + geom_point(aes(class, cty)) + geom_boxplot(aes(trans, hwy))
最后发现这个图形是可以运行的。经过分析可以发现,在mpg
数据集里面,class
和trans
都是分类变量。同时cty
和hwy
都是连续性变量。由于变量类型是一样的,所以是可以运行的。
对于图形的意义,对于二维的坐标轴而言。虽然可以画出来图形,但是其中含有的信息太多了。所以其实意义不大。如果一定要画这两个图的画。莫不如拆开分开画
p1 <- ggplot(mpg) + geom_point(aes(hwy, cty))
p2 <- ggplot(mpg) + geom_boxplot(aes(trans, hwy))
cowplot::plot_grid(p1, p2, nrow = 1)
3. 不同数据类型在一个坐标轴组合
如果是连续性坐标轴在添加离散型则会发生错误。
ggplot(mpg) + geom_point(aes(hwy, cty)) + geom_boxplot(aes(trans, hwy))
## Error: Discrete value supplied to continuous scale
而如果是离散型坐标轴再添加连续性坐标轴的画,则可以绘制出来
ggplot(mpg) + geom_boxplot(aes(trans, hwy)) + geom_point(aes(hwy, cty))
究其原因是因为我们在绘制图层的时候,如果先指定了连续性坐标轴,对于离散型的变量是没办法转换为连续性变量的具体的值的。但是对于连续性数值则可以转换为离散型的变量。
例如我们可以把数字变为字符,但是不能把字符变为数字
as.character(10)
## [1] "10"
as.numeric("asd")
## Warning: NAs introduced by coercion
## [1] NA
5.5 几何对象
4. 识别出图的使用函数
- 第一个图使用的是小提琴图
geom_violin
的函数来展示的
ggplot(mpg, aes(drv, displ)) + geom_violin()
- 第二个图使用的是散点图
geom_point
同时映射来另外另外一个变量到散点的大小上。
ggplot(mpg, aes(hwy, cty, size = displ)) + geom_point(alpha = 0.1, show.legend = F)
- 使用了封箱六边形
geom_hex
的图来展示分布
ggplot(mpg, aes(hwy, cty)) + geom_hex(size = 3)
- 使用了抖动图
geom_jitter
来绘制
ggplot(mpg, aes(cyl, drv)) + geom_jitter(width = 0.1, height = 0.1)
- 使用了面积图
geom_area
来展示变化
ggplot(economics, aes(date, psavert)) +
geom_area()
- 使用路径图
geom_path
来绘制路径的变化
ggplot(economics, aes(uempmed, psavert)) +
geom_path(size = 1)
5. 提出有用的可视化方案
- 展示变量随时间的变化:使用线图
geom_line
即可展示
ggplot(economics, aes(date, psavert)) +
geom_line()
- 展示单一变量的分布:
对于变量的分布的展示基本上有多个函数可以展示,最常用的是geom_histogram
;同时还有类似的geom_freqpoly
以及geom_density
p1 <- ggplot(diamonds, aes(carat)) + geom_histogram()
p2 <- ggplot(diamonds, aes(carat)) + geom_freqpoly()
p3 <- ggplot(diamonds, aes(carat)) + geom_density()
cowplot::plot_grid(p1, p2,p3, nrow = 1)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
展示数据集的整体趋势,使用
geom_line
或者geom_area
都可以用来展示绘制地图。 地图的绘制可以通过
geom_sf()
,geom_polygon()
,
coord_quickmap()
3. 标记离群点
如果只是通过颜色等标记离群点的画,geom_boxplot
里面会有outlier
参数来设置离群点的变化
ggplot(mpg, aes(factor(cyl), cty)) + geom_boxplot(outlier.colour = "red", outlier.shape = 10, outlier.size = 8)
如果需要使用label标记的话,则需要通过先检测各个值是不是离群值然后在进行设置
5.6 生成变量
1. 模仿geom_smooth()
mod <- loess(hwy ~ displ, data = mpg)
smoothed <- data.frame(displ = seq(1.6, 7, length = 50))
pred <- predict(mod, newdata = smoothed, se = TRUE)
smoothed$hwy <- pred$fit
smoothed$hwy_lwr <- pred$fit - 1.96 * pred$se.fit
smoothed$hwy_upr <- pred$fit + 1.96 * pred$se.fit
smoothed
## displ hwy hwy_lwr hwy_upr
## 1 1.600000 33.09286 31.55842 34.62729
## 2 1.710204 32.16100 30.90050 33.42149
## 3 1.820408 31.26635 30.23415 32.29855
## 4 1.930612 30.41403 29.55725 31.27081
## 5 2.040816 29.60168 28.86378 30.33957
我们可以先看一下传统的geom_smooth
的图形是什么样子的。
ggplot(mpg, aes(displ, hwy)) + geom_point() + geom_smooth()
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
通过上图,我们可以看到默认的smoooth
的图形包括了95%的可信区间。这个对应的是我们smooth数据集当中的hwy_lwr
和hwy_upr
数据。同时也在中间形成了一条hwy
的线。我们可以通过geom_ribbon
来创建其95%可信区间。同时通过geom_line
创建拟合线。最后的代码是
ggplot(mpg, aes(displ, hwy)) +
geom_point() +
geom_ribbon(data = smoothed,aes(ymin = hwy_lwr, ymax = hwy_upr, x = displ), fill = "grey", alpha = 0.5) + geom_line(data = smoothed, aes(x = displ, y = hwy), color = "blue")
2.图形使用了什么统计变换
- 这个图绘制的是一个关于
displ
的经验积累分布的图。这个图可以通过stat_ecdf
来进行绘制
ggplot(mpg, aes(displ)) + stat_ecdf()
- 第二个图绘制的是一个qq图。来查看数据是否符合正态分布的。这个我们可以通过
stat_qq
来实现
ggplot(mpg, aes(sample = displ)) + stat_qq()
- 第三个图是一个密度图,这个我们可以通过
stat_bin
来进行绘制
ggplot(mpg, aes(displ, y = ..density..,color = drv)) + stat_bin(geom = "density")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
3.geom_count的作用
geom_count
是另外一种形式的geom_point
,它相较于geom_point
会对在同一个位置的多个点进行统计,然后把重叠的点的个数映射到点的大小上。这个也是一种处理点重叠的方式,另外还有的几种方式包括:geom_jitter
以及透明度映射
p <- ggplot(mpg, aes(drv, trans))
p1 <- p + geom_point()
p2 <- p + geom_count()
p3 <- p + geom_jitter()
cowplot::plot_grid(p1,p2,p3, ncol = 1)
5.7 位置调整
1. position_nudge的作用
这个函数可以通常在对数据进行标注的时候,因为数据点有可能和数据重叠,通过geom_nudge
可以稍微移开一段距离。
df <- data.frame(
x = c(1,3,2,5),
y = c("a","c","d","c")
)
p1 <- ggplot(df, aes(x, y)) +
geom_point() +
geom_text(aes(label = y))
p2 <- ggplot(df, aes(x, y)) +
geom_point() +
geom_text(aes(label = y), position = position_nudge(y = -0.1))
cowplot::plot_grid(p1, p2)
2. 位置函数的使用
对于三种位置函数fill
; dodge
;
stack
。了解其主要的呈现方式基本上就可以了解其使用环境了。这个可以具体看书
3. geom_jitter和geom_count
对于两个函数的区别,可见上一章的第三题。个人认为如果但从图形上分析,重叠点数特别多的时候可以使用geom_count
如果重叠的点数少的时候可以使用geom_jitter
。另外如要和其他图形组合的时候,比如和geom_boxplot
其实jitter
可能会更好一些
4. 堆叠面积图的使用
# create data
time <- as.numeric(rep(seq(1,7),each=7)) # x Axis
value <- runif(49, 10, 100) # y Axis
group <- rep(LETTERS[1:7],times=7) # group, one shape per group
data <- data.frame(time, value, group)
Parea <- ggplot(data, aes(x=time, y=value, fill=group)) +
geom_area()
PLine <- ggplot(data, aes(x=time, y=value, color=group)) +
geom_line()
cowplot::plot_grid(Parea, PLine, nrow = 1)
通过上面两个图可以发现,面积图
可以观察整体不同的变化,线图
则只能不同分组之间的变化