[R|ggplot2] ggplot2数据分析与图形艺术课后题:第五章

这个主要是对《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

解析一下目标图形,

  1. mpg数据集里面绘制以class为横坐标,以hwy为纵坐标的震荡图

  2. class数据集,同样绘制
    相关坐标系的点图。同时把点的大小放大。为了好看也可以设置一下颜色和透明度。

  3. 在y = 10的地方添加每一组的一个样本统计。

  4. 适当的调整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)
[R|ggplot2] ggplot2数据分析与图形艺术课后题:第五章_第1张图片
image.png

5.4 图层映射

============

1. 简化图形


  1. 我们在进行图层映射的时候,如果目标数据来源是映射的数据集,那么可以直接写列名即可。
ggplot(mpg) + geom_point(aes(displ, hwy))
[R|ggplot2] ggplot2数据分析与图形艺术课后题:第五章_第2张图片
image.png
  1. 如果多个绘图函数都是是有相同的数据集和映射。那么只需要在前面指定一次即可
ggplot(mpg, aes(cty, hwy)) + geom_point() + geom_smooth()

## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
[R|ggplot2] ggplot2数据分析与图形艺术课后题:第五章_第3张图片
image.png
  1. 在做图的时候需要确定目标数据集,如果是无用的数据集不需要进行设定
ggplot() + geom_point(aes(log(brainwt), log(bodywt)), data = msleep)

## Warning: Removed 27 rows containing missing values (geom_point).
[R|ggplot2] ggplot2数据分析与图形艺术课后题:第五章_第4张图片
image.png

2.示例图形有用没


试运行示例代码

ggplot(mpg) + geom_point(aes(class, cty)) + geom_boxplot(aes(trans, hwy))
[R|ggplot2] ggplot2数据分析与图形艺术课后题:第五章_第5张图片
image.png

最后发现这个图形是可以运行的。经过分析可以发现,在mpg数据集里面,classtrans都是分类变量。同时ctyhwy都是连续性变量。由于变量类型是一样的,所以是可以运行的。

对于图形的意义,对于二维的坐标轴而言。虽然可以画出来图形,但是其中含有的信息太多了。所以其实意义不大。如果一定要画这两个图的画。莫不如拆开分开画

p1 <- ggplot(mpg) + geom_point(aes(hwy, cty))
p2 <- ggplot(mpg) + geom_boxplot(aes(trans, hwy))
cowplot::plot_grid(p1, p2, nrow = 1)
[R|ggplot2] ggplot2数据分析与图形艺术课后题:第五章_第6张图片
image.png

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))
[R|ggplot2] ggplot2数据分析与图形艺术课后题:第五章_第7张图片
image.png

究其原因是因为我们在绘制图层的时候,如果先指定了连续性坐标轴,对于离散型的变量是没办法转换为连续性变量的具体的值的。但是对于连续性数值则可以转换为离散型的变量。
例如我们可以把数字变为字符,但是不能把字符变为数字

as.character(10)

## [1] "10"

as.numeric("asd")

## Warning: NAs introduced by coercion

## [1] NA

5.5 几何对象

4. 识别出图的使用函数


  1. 第一个图使用的是小提琴图geom_violin的函数来展示的
ggplot(mpg, aes(drv, displ)) + geom_violin()
[R|ggplot2] ggplot2数据分析与图形艺术课后题:第五章_第8张图片
image.png
  1. 第二个图使用的是散点图geom_point同时映射来另外另外一个变量到散点的大小上。
ggplot(mpg, aes(hwy, cty, size = displ)) + geom_point(alpha = 0.1, show.legend = F)
[R|ggplot2] ggplot2数据分析与图形艺术课后题:第五章_第9张图片
image.png
  1. 使用了封箱六边形geom_hex的图来展示分布
ggplot(mpg, aes(hwy, cty)) + geom_hex(size = 3)
[R|ggplot2] ggplot2数据分析与图形艺术课后题:第五章_第10张图片
image.png
  1. 使用了抖动图geom_jitter来绘制
ggplot(mpg, aes(cyl, drv)) + geom_jitter(width = 0.1, height = 0.1)
[R|ggplot2] ggplot2数据分析与图形艺术课后题:第五章_第11张图片
image.png
  1. 使用了面积图geom_area来展示变化
ggplot(economics, aes(date, psavert)) +
  geom_area()
[R|ggplot2] ggplot2数据分析与图形艺术课后题:第五章_第12张图片
image.png
  1. 使用路径图geom_path来绘制路径的变化
ggplot(economics, aes(uempmed, psavert)) +
  geom_path(size = 1)
[R|ggplot2] ggplot2数据分析与图形艺术课后题:第五章_第13张图片
image.png

5. 提出有用的可视化方案


  1. 展示变量随时间的变化:使用线图geom_line即可展示
ggplot(economics, aes(date, psavert)) +
  geom_line()
[R|ggplot2] ggplot2数据分析与图形艺术课后题:第五章_第14张图片
image.png
  1. 展示单一变量的分布:
    对于变量的分布的展示基本上有多个函数可以展示,最常用的是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`.
[R|ggplot2] ggplot2数据分析与图形艺术课后题:第五章_第15张图片
image.png
  1. 展示数据集的整体趋势,使用geom_line或者geom_area都可以用来展示

  2. 绘制地图。 地图的绘制可以通过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)
[R|ggplot2] ggplot2数据分析与图形艺术课后题:第五章_第16张图片
image.png

如果需要使用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'
[R|ggplot2] ggplot2数据分析与图形艺术课后题:第五章_第17张图片
image.png

通过上图,我们可以看到默认的smoooth的图形包括了95%的可信区间。这个对应的是我们smooth数据集当中的hwy_lwrhwy_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")
[R|ggplot2] ggplot2数据分析与图形艺术课后题:第五章_第18张图片
image.png

2.图形使用了什么统计变换


  1. 这个图绘制的是一个关于displ的经验积累分布的图。这个图可以通过stat_ecdf来进行绘制
ggplot(mpg, aes(displ)) + stat_ecdf()
[R|ggplot2] ggplot2数据分析与图形艺术课后题:第五章_第19张图片
image.png
  1. 第二个图绘制的是一个qq图。来查看数据是否符合正态分布的。这个我们可以通过stat_qq来实现
ggplot(mpg, aes(sample = displ)) + stat_qq()
[R|ggplot2] ggplot2数据分析与图形艺术课后题:第五章_第20张图片
image.png
  1. 第三个图是一个密度图,这个我们可以通过stat_bin来进行绘制
ggplot(mpg, aes(displ, y = ..density..,color = drv)) + stat_bin(geom = "density")

## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
[R|ggplot2] ggplot2数据分析与图形艺术课后题:第五章_第21张图片
image.png

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)
[R|ggplot2] ggplot2数据分析与图形艺术课后题:第五章_第22张图片
image.png

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)
[R|ggplot2] ggplot2数据分析与图形艺术课后题:第五章_第23张图片
image.png

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)
[R|ggplot2] ggplot2数据分析与图形艺术课后题:第五章_第24张图片
image.png

通过上面两个图可以发现,面积图可以观察整体不同的变化,线图则只能不同分组之间的变化

你可能感兴趣的:([R|ggplot2] ggplot2数据分析与图形艺术课后题:第五章)