这个主要是对《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)
2. 简化图形
- 第一个图形的代码是:
ggplot(mpg, aes(displ)) + scale_y_continuous("Highway mpg") +
scale_x_continuous() + geom_point(aes(y = hwy))
对于这个图形的简化,
- 因为只有一个图层形成,所以我们最好还是
x
和y
参数放到一起 - 由于两个本身就是连续性变量,所以不需要
scale_x_continuous
来指定。 - 如果只是对Y轴命名的话,其实可以通过
ylab
来实现,而不用通过scale_y_continuous
来实现的。
ggplot(mpg, aes(displ, hwy)) + geom_point() + ylab("Highway mpg")
- 第二个图形是
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.
对于图形的简化的话,主要有以下几点
同样的可以把所有的映射放到一起。另外在
ggplot
里面关于y
和x
的映射是反的。这个有碍常规,可以调整过来,同时可以去掉x=\y=
关于X轴设定了两次标题。图层的叠加只会任最后一个,所以可以去掉前面一个。同样的关于
color
的设定也是。由于只是改了标题。关于标题的修改。可以通过
labs
函数来统一修改。而不用每个都设定
ggplot(mpg, aes(class, displ, color = drv)) + geom_point() +
labs(x = "Type of car", y = "Displacement (l)",
color = "Drive\ntrain")
6.3.3 练习题
============
1. 复现图片
ggplot(mpg, aes(displ, hwy)) + geom_point() +
labs(x = "Displacement") +
scale_y_continuous(expression(Highway (frac(Miles,Gallon))))
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"))
-
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"))
至于为什么在进行分割时候出现不是从0开始的情况。也是因为我们在坐标轴默认设置的使用expand
会在默认的breaks上多加一些变量。如果把expand = c(0,0)
则就好了。
3. 再现图形
这个图形默认的是一个散点图,其中默认的图形是这样的,
ggplot(mpg, aes(displ, hwy, color = drv)) + geom_point()
和要复现的图形相比,就是对图例进行了修改,我们可以要么直接更改数据,要么修改图例的内容即可。
ggplot(mpg, aes(displ, hwy, color = drv)) + geom_point() +
scale_color_discrete(labels = paste0(c("4","f","r"), "wd"))
4.具体坐标轴设置
- 创建数学表达式的函数:
我们可以通过quote
来创建数学表达式函数
- 创建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())
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")
2. 修改图形
题目当中给出来的是图是这样的
ggplot(mpg, aes(displ, hwy)) +
geom_point(aes(color = drv, shape = drv)) +
scale_color_discrete("Drive train")
这个图片的对于颜色
和点形状
的映射都是基于drv这个变量的。对于统一变量的不同映射其实可以放到一起的。这个图由于对图例的颜色名称进行了修改所以就导致分开了。其实应该把两个都修改然后图例就合一起了。同时如果只是来修改图例名称的话,我们可以通过labs
来进行修改。
ggplot(mpg, aes(displ, hwy)) +
geom_point(aes(color = drv, shape = drv)) +
labs(color = "Drive train", shape = "Drive train")
3. 复现图形
通过观察图形,我们可以发现。
- 这个图形的坐标轴的变量是
displ
和hwy
。同时把颜色映射到class
上 - 这个图形使用了
geom_point
和geom_smooth
的两个图形。 - 关于
geom_smooth
图形拟合的方法是lm
。每一条线只有拟合线,没有95%CI,所以se = F
。 - 图形的图例是放到下面的(
legend.postion = "bottom"
),同时去掉了图例的标题(labs(color = NULL)
) - 所有的图例内容都放到了一排上
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))
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)
如果需要统一两个图的坐标轴和图例的话,我们需要计算以下两个数据集的信息
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)
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)
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.
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)
6.6.5 练习题
- 探索自带color函数的分布
color_df <- colors()
ggplot(luv_colours, aes(u, v)) +
geom_point(aes(color = color_df), size = 2) +
scale_color_identity() +
coord_equal()