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

这个主要是对《ggplot2数据分析与图形艺术》第六章相关练习题的总结

library(tidyverse)

ggplot2数据分析与图形艺术课后题:第二章
ggplot2数据分析与图形艺术课后题:第三章
ggplot2数据分析与图形艺术课后题:第五章
ggplot2数据分析与图形艺术课后题:第六章
ggplot2数据分析与图形艺术课后题:第七章
ggplot2数据分析与图形艺术课后题:第八章

6.2.1 练习题

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

1. 离散型标度和连续性标度的互换


这个题其实和之前的一个的一个题很像。一般来说,如果把连续性变成离散型其实没有多大变化。但是如果把离散型变成连续性的话,则会发生错误

  • 把离散型变成连续性:报错
ggplot(mpg, aes(class, hwy)) +
  geom_jitter(width = 0.05, height = 0.05) +
  scale_x_continuous()
# Error: Discrete value supplied to continuous scale
  • 把连续性变成离散型:
    可以绘制。但是绘图的时候,坐标着的标度则消失了。
p <- ggplot(mpg, aes(displ, hwy)) +
geom_point()
p1 <- p + scale_x_discrete() +scale_y_discrete()
cowplot::plot_grid(p, p1, nrow = 1)
[R|ggplot2] ggplot2数据分析与图形艺术课后题:第六章_第1张图片
image.png

2. 简化图形


  1. 第一个图形的代码是:
ggplot(mpg, aes(displ)) + scale_y_continuous("Highway mpg") + 
    scale_x_continuous() + geom_point(aes(y = hwy))
[R|ggplot2] ggplot2数据分析与图形艺术课后题:第六章_第2张图片
image.png

对于这个图形的简化,

  1. 因为只有一个图层形成,所以我们最好还是xy参数放到一起
  2. 由于两个本身就是连续性变量,所以不需要scale_x_continuous来指定。
  3. 如果只是对Y轴命名的话,其实可以通过ylab来实现,而不用通过scale_y_continuous来实现的。
ggplot(mpg, aes(displ, hwy)) + geom_point() + ylab("Highway mpg")
[R|ggplot2] ggplot2数据分析与图形艺术课后题:第六章_第3张图片
image.png
  1. 第二个图形是
ggplot(mpg, aes(y = displ, x = class)) + 
    scale_y_continuous("Displacement (l)") + 
    scale_x_discrete("Car type") + 
    scale_x_discrete("Type of car") + 
    scale_color_discrete() + 
    geom_point(aes(color = drv)) + 
    scale_color_discrete("Drive\ntrain")

## Scale for 'x' is already present. Adding another scale for 'x', which will
## replace the existing scale.

## Scale for 'colour' is already present. Adding another scale for 'colour',
## which will replace the existing scale.
[R|ggplot2] ggplot2数据分析与图形艺术课后题:第六章_第4张图片
image.png

对于图形的简化的话,主要有以下几点

  1. 同样的可以把所有的映射放到一起。另外在ggplot里面关于yx的映射是反的。这个有碍常规,可以调整过来,同时可以去掉x=\y=

  2. 关于X轴设定了两次标题。图层的叠加只会任最后一个,所以可以去掉前面一个。同样的关于color的设定也是。

  3. 由于只是改了标题。关于标题的修改。可以通过labs函数来统一修改。而不用每个都设定

ggplot(mpg, aes(class, displ, color = drv)) + geom_point() + 
    labs(x = "Type of car", y = "Displacement (l)", 
         color = "Drive\ntrain")
[R|ggplot2] ggplot2数据分析与图形艺术课后题:第六章_第5张图片
image.png

6.3.3 练习题

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

1. 复现图片


ggplot(mpg, aes(displ, hwy)) + geom_point() + 
    labs(x = "Displacement") + 
    scale_y_continuous(expression(Highway (frac(Miles,Gallon))))
[R|ggplot2] ggplot2数据分析与图形艺术课后题:第六章_第6张图片
image.png

2. break和labels的对象类型


通过阅读文档,我们可以知道关于break和label接受的类型包括

  • NULL代表使用默认的文档
  • waiver()用于转换对象计算的默认中断
  • vector一个向量代表不同的刻度
ggplot(mpg, aes(hwy, cty)) + geom_point() + 
    scale_x_continuous(breaks = c(20,25,30,35,40),
                       labels = paste0(c(20,25,30,35,40), "aaa"))
[R|ggplot2] ggplot2数据分析与图形艺术课后题:第六章_第7张图片
image.png
  • function对于break而言是一个以limits为输入,以break为输出的函数,对于labels而言是一个以breaks为输入,以labels为输出的函数
ggplot(mpg, aes(hwy, cty)) + geom_point() + 
    scale_x_continuous(limits = c(0,50), 
                       breaks = function(limits) seq(limits[1], limits[2], length.out = 5),
                       labels = function(breaks) paste0(breaks, "qqq"))
[R|ggplot2] ggplot2数据分析与图形艺术课后题:第六章_第8张图片
image.png

至于为什么在进行分割时候出现不是从0开始的情况。也是因为我们在坐标轴默认设置的使用expand会在默认的breaks上多加一些变量。如果把expand = c(0,0)则就好了。

3. 再现图形


这个图形默认的是一个散点图,其中默认的图形是这样的,

ggplot(mpg, aes(displ, hwy, color = drv)) + geom_point()
[R|ggplot2] ggplot2数据分析与图形艺术课后题:第六章_第9张图片
image.png

和要复现的图形相比,就是对图例进行了修改,我们可以要么直接更改数据,要么修改图例的内容即可。

ggplot(mpg, aes(displ, hwy, color = drv)) + geom_point() +
    scale_color_discrete(labels = paste0(c("4","f","r"), "wd"))
[R|ggplot2] ggplot2数据分析与图形艺术课后题:第六章_第10张图片
image.png

4.具体坐标轴设置


  1. 创建数学表达式的函数:

我们可以通过quote来创建数学表达式函数

  1. 创建1st等标签

我们可以通过scales::ordinal_format()创建

df <- data.frame(x = c(1,3,2,5),
                 y = c("a", "c", "d", "c"))
ggplot(df, aes(x, y)) + 
    geom_point() + 
    scale_x_continuous(labels = scales::ordinal_format())
[R|ggplot2] ggplot2数据分析与图形艺术课后题:第六章_第11张图片
image.png

5. 坐标轴和图例上共有的参数


个人感觉能够共同应用于坐标轴和图例上的参数是limits, breaks and
labels

6.4.4 练习题

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

1. 如何将图例放到图形的左边


我们可以使用在theme函数当中使用legend.postion参数来把图例放到图形的左边

ggplot(mpg, aes(hwy, cty, color = drv)) + geom_point() + 
    theme(legend.position = "left")
[R|ggplot2] ggplot2数据分析与图形艺术课后题:第六章_第12张图片
image.png

2. 修改图形


题目当中给出来的是图是这样的

ggplot(mpg, aes(displ, hwy)) + 
    geom_point(aes(color = drv, shape = drv)) + 
    scale_color_discrete("Drive train")
[R|ggplot2] ggplot2数据分析与图形艺术课后题:第六章_第13张图片
image.png

这个图片的对于颜色点形状的映射都是基于drv这个变量的。对于统一变量的不同映射其实可以放到一起的。这个图由于对图例的颜色名称进行了修改所以就导致分开了。其实应该把两个都修改然后图例就合一起了。同时如果只是来修改图例名称的话,我们可以通过labs来进行修改。

ggplot(mpg, aes(displ, hwy)) + 
    geom_point(aes(color = drv, shape = drv)) + 
    labs(color = "Drive train", shape = "Drive train")
[R|ggplot2] ggplot2数据分析与图形艺术课后题:第六章_第14张图片
image.png

3. 复现图形


[R|ggplot2] ggplot2数据分析与图形艺术课后题:第六章_第15张图片
image.png

通过观察图形,我们可以发现。

  1. 这个图形的坐标轴的变量是displhwy。同时把颜色映射到class
  2. 这个图形使用了geom_pointgeom_smooth的两个图形。
  3. 关于geom_smooth图形拟合的方法是lm。每一条线只有拟合线,没有95%CI,所以se = F
  4. 图形的图例是放到下面的(legend.postion = "bottom"),同时去掉了图例的标题(labs(color = NULL))
  5. 所有的图例内容都放到了一排上nrow = 1

所以需要画出以上图形的代码是

ggplot(mpg, aes(displ, hwy, color = class)) + geom_point() +     geom_smooth(method = "lm", se = F) + labs(color = NULL) + theme(legend.position = "bottom") + guides(color = guide_legend(nrow = 1))
[R|ggplot2] ggplot2数据分析与图形艺术课后题:第六章_第16张图片
image.png

6.5.1 练习题

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

1.调整两个图形的代码,使得图形和坐标轴一致


fwd <- subset(mpg, drv == "f")
rwd <- subset(mpg, drv == "r")

p1 <- ggplot(fwd, aes(displ, hwy, colour = class)) + geom_point()
p2 <- ggplot(rwd, aes(displ, hwy, colour = class)) + geom_point()
cowplot::plot_grid(p1, p2, nrow = 1)
[R|ggplot2] ggplot2数据分析与图形艺术课后题:第六章_第17张图片
image.png

如果需要统一两个图的坐标轴和图例的话,我们需要计算以下两个数据集的信息

x_min <- min(c(fwd$displ, rwd$displ))
x_max <- max(c(fwd$displ, rwd$displ))
y_min <- min(c(fwd$hwy, rwd$hwy))
y_max <- max(c(fwd$hwy, rwd$hwy))
AllClass <- unique(c(fwd$class, rwd$class))
p3 <- p1 + lims(x = c(x_min, x_max), y = c(y_min, y_max)) + 
    scale_color_discrete(limits = AllClass)
p4 <- p2 + lims(x = c(x_min, x_max), y = c(y_min, y_max)) + 
    scale_color_discrete(limits = AllClass)
cowplot::plot_grid(p3, p4, nrow = 1)
[R|ggplot2] ggplot2数据分析与图形艺术课后题:第六章_第18张图片
image.png

2. expand_limits的作用


对于坐标轴的长度的限制,我们可以使用xlim或者ylim进行单独的设置,或者通过lims来进行统一的设置。以上的这三个函数都是接受长度为2的向量,来代表坐标轴的最小值和最大值。但是如果我们要修改其中一个范围就不能使用了。

p1 + xlim(0)
# Error in limits.numeric(c(...), "x") : length(lims) == 2 is not TRUE

expand_limits则可以设置但一个向量来代表只是修改限制的一侧。同时对于图例的修改内容的修改。如果想要增加图例当中的内容也是可以通过这个函数来进行修改的。所以其实上一题的答案,我们完全可以通过这个函数来进行统一

p1 + expand_limits(x = c(x_min, x_max), y = c(y_min, y_max), color = AllClass)
[R|ggplot2] ggplot2数据分析与图形艺术课后题:第六章_第19张图片
image.png

3. 两个xlim的设置


如果存在两个xlim的话,其实就是图层的贴加,后面一个图层就会把前面的图层进行覆盖。

p1 + xlim(2,5) + xlim(0, 7)

## Scale for 'x' is already present. Adding another scale for 'x', which will
## replace the existing scale.
[R|ggplot2] ggplot2数据分析与图形艺术课后题:第六章_第20张图片
image.png

4. limits设置为NA会怎么样


设置成NA会把之前设置的坐标轴返回到默认的坐标轴上。

p1 <- ggplot(fwd, aes(displ, hwy, colour = class)) + geom_point()
p2 <- p1 + xlim(0, 50)
p3 <- p1 +  xlim(0, 50) + scale_x_continuous(limits = c(NA, NA))

## Scale for 'x' is already present. Adding another scale for 'x', which will
## replace the existing scale.

cowplot::plot_grid(p1, p2, p3, ncol  = 1)
[R|ggplot2] ggplot2数据分析与图形艺术课后题:第六章_第21张图片
image.png

6.6.5 练习题

  1. 探索自带color函数的分布

color_df <- colors()

ggplot(luv_colours, aes(u, v)) +
  geom_point(aes(color = color_df), size = 2) +
  scale_color_identity() +
  coord_equal()
[R|ggplot2] ggplot2数据分析与图形艺术课后题:第六章_第22张图片
image.png

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