table {
border-collapse: collapse;
width: 100%;
margin-bottom: 1rem;
}
th, td {
border: 1px solid #ddd;
padding: 8px;
text-align: left;
}
th {
background-color: #f2f2f2;
}
tr:nth-child(even) {
background-color: #f9f9f9;
}
pre {
background-color: #f8f8f8;
padding: 15px;
border-radius: 4px;
overflow-x: auto;
}
1、描述以下每个绘图所使用的数据、美学映射和图层。在运行代码之前,预测出绘图的样子。1. ggplot(mpg, aes(cty, hwy)) + geom_point() 2. ggplot(diamonds, aes(carat, price)) + geom_point() 3. ggplot(economics, aes(date, unemploy)) + geom_line() 4. ggplot(mpg, aes(cty)) + geom_histogram()
数据:mpg;
美学映射:将变量
cty
映射到 x 轴,
hwy
映射到 y 轴;
图层:散点图图层。
预测
:呈现城市里程(
cty
)和公路里程(
hwy
)关系的散点图。
数据:diamonds;
美学映射:将变量
carat
映射到 x 轴,
price
映射到 y 轴;
图层:散点图图层。
预测
:呈现钻石克拉数(
carat
)和价格(
price
)关系的散点图。
数据:economics;
美学映射:将变量
date
映射到 x 轴,
unemploy
映射到 y 轴;
图层:折线图图层。
预测
:呈现日期(
date
)和失业人数(
unemploy
)关系的折线图。
数据:mpg;
美学映射:将变量
cty
映射到 x 轴;
图层:直方图图层。
预测
:呈现城市里程(
cty
)分布的直方图。
2、在R语言中,使用facet_wrap()函数时,可以使用哪些参数来控制输出中显示的行数和列数?
可以使用ncol和nrow参数来控制输出中的列数和行数。
3、facet_wrap() 中的 scales 参数有什么作用?什么时候会用到它?
`scales` 参数可控制各面板的位置刻度是否相同(固定)或允许在面板间变化(自由),有以下取值:
- `'fixed'` 表示所有面板的 x 和 y 刻度固定;
- `'free_x'` 表示 x 刻度自由,y 刻度固定;
- `'free_y'` 表示 y 刻度自由,x 刻度固定;
- `'free'` 表示 x 和 y 刻度在各面板间变化。
固定刻度便于查看各面板间的模式,自由刻度便于查看面板内的模式。
4、绘制以下各种指定图形应使用哪些几何对象(geoms)?1. 散点图 2. 折线图 3. 直方图 4. 条形图 5. 饼图
散点图使用
geom_point
折线图使用
geom_line
直方图使用
geom_histogram
条形图使用
geom_bar
ggplot2
中没有专门用于绘制饼图的
geom
,可通过
geom_bar
结合一定转换实现
5、geom_path() 和 geom_polygon() 有什么区别?geom_path() 和 geom_line() 有什么区别?
`geom_path()` 连接数据中各点,`geom_polygon()` 绘制填充的多边形,多边形每个顶点数据需单独一行。`geom_line()` 从左到右连接点,`geom_path()` 按数据中出现的顺序连接点,二者都支持 `linetype` 美学映射。
6、修改以下绘图代码,使得每个整数
displ
值对应一个箱线图。代码为:
ggplot(mpg, aes(displ, cty)) + geom_boxplot()
displ
ggplot(mpg, aes(displ, cty)) + geom_boxplot()
可以将
displ
转换为整数,再绘制箱线图,代码如下:
ggplot(mpg, aes(floor(displ), cty)) + geom_boxplot()
这里
floor()
函数用于将
displ
的值向下取整为最接近的整数。
7、叠加深度的频率多边形图和密度图。为了使这两个图具有可比性,你需要将哪个计算变量映射到y轴上?(你可以修改geom_freqpoly()或geom_density())
应将密度(density)变量映射到y轴,因为频率多边形和密度图默认y轴映射不同,密度是计数除以总计数再乘以组距,用密度可使二者可比。
8、简化以下绘图规范:ggplot(mpg) + geom_point(aes(mpg$disp, mpg$hwy));ggplot() + geom_point(mapping = aes(y = hwy, x = cty), data = mpg) + geom_smooth(data = mpg, mapping = aes(cty, hwy));ggplot(diamonds, aes(carat, price)) + geom_point(aes(log(brainwt), log(bodywt)), data = msleep)
对于
ggplot(mpg) + geom_point(aes(mpg$disp, mpg$hwy))
,不能在
aes()
里用
$
引用变量,应改为:
r
ggplot(mpg, aes(disp, hwy)) + geom_point()
对于
ggplot() + geom_point(mapping = aes(y = hwy, x = cty), data = mpg) + geom_smooth(data = mpg, mapping = aes(cty, hwy))
,可把数据映射放到
ggplot()
里,简化为:
r
ggplot(mpg, aes(cty, hwy)) + geom_point() + geom_smooth()
对于
ggplot(diamonds, aes(carat, price)) + geom_point(aes(log(brainwt), log(bodywt)), data = msleep)
,这里有两组数据和映射,不能简单合并,不过可以把
aes()
里的简单计算用
dplyr::mutate()
提前处理,代码简化为:
“`r
library(dplyr)
msleep_new <- msleep %>%
mutate(log_brainwt = log(brainwt), log_bodywt = log(bodywt))
ggplot(diamonds, aes(carat, price)) +
geom_point(data = msleep_new, aes(log_brainwt, log_bodywt))
“`
9、从 http://www.rstudio.com/resources/cheatsheets/ 下载并打印 ggplot2 速查表,这样你就有了所有几何对象的便捷可视化参考。
需从指定链接下载并打印 ggplot2 速查表,以获取所有几何对象的便捷可视化参考。
10、简化以下绘图规范,使其更易于理解。第一个绘图规范:ggplot(mpg, aes(displ)) + scale_y_continuous(“Highway mpg”) + scale_x_continuous() + geom_point(aes(y = hwy)) 第二个绘图规范:ggplot(mpg, aes(y = displ, x = class)) + scale_y_continuous(“Displacement (l)”) + scale_x_discrete(“Car type”) + scale_x_discrete(“Type of car”) + scale_colour_discrete() + geom_point(aes(colour = drv)) + scale_colour_discrete(“Drive train”)
绘图规范
第一个绘图规范
数据集
:mpg
图表类型
:散点图
x轴
:发动机排量(
displ
)
y轴
:公路油耗(
hwy
)
y轴标签
:Highway mpg
第二个绘图规范
数据集
:mpg
图表类型
:散点图
x轴
:汽车类型(
class
)
y轴
:发动机排量(
displ
)
点的颜色
:根据驱动类型(
drv
)区分
y轴标签
:Displacement (l)
x轴标签
:Type of car
颜色图例标签
:Drive train
注意
:原代码中
scale_x_discrete("Car type")
多余,可删除
11、如何让图例显示在图表左侧?
可以通过
theme()
函数修改
legend.position
主题设置,将其值设为 “left”,示例代码如下:
df <- data.frame(x = 1:3, y = 1:3, z = c("a", "b", "c"))
base <- ggplot(df, aes(x, y)) +
geom_point(aes(colour = z), size = 3) +
xlab(NULL) +
ylab(NULL)
base + theme(legend.position = "left")
12、在使用ggplot2绘图时,执行代码
ggplot(mpg, aes(displ, hwy)) + geom_point(aes(colour = drv, shape = drv)) + scale_colour_discrete("Drive train")
绘图可能会出现什么问题?如何修复它?
ggplot(mpg, aes(displ, hwy)) + geom_point(aes(colour = drv, shape = drv)) + scale_colour_discrete("Drive train")
问题在于没有为形状设置对应的标签,仅为颜色设置了标签。修复方法是在
scale_shape_discrete()
中添加对应的标签。代码可修改为:
ggplot(mpg, aes(displ, hwy)) +
geom_point(aes(colour = drv, shape = drv)) +
scale_colour_discrete("Drive train") +
scale_shape_discrete("Drive train")
13、以下代码为 mpg 数据集创建了两个绘图。在不使用分面的情况下,修改代码使图例和坐标轴匹配:fwd <- subset(mpg, drv == “f”) rwd <- subset(mpg, drv == “r”) ggplot(fwd, aes(displ, hwy, colour = class)) + geom_point() ggplot(rwd, aes(displ, hwy, colour = class)) + geom_point()
可以通过设置相同的坐标轴范围和颜色映射来使图例和坐标轴匹配。以下是修改后的代码:
library(ggplot2)
# 数据子集
fwd <- subset(mpg, drv == "f")
rwd <- subset(mpg, drv == "r")
# 定义共同的坐标轴范围
xlims <- range(c(fwd$displ, rwd$displ))
ylims <- range(c(fwd$hwy, rwd$hwy))
# 第一个图
p1 <- ggplot(fwd, aes(displ, hwy, colour = class)) +
geom_point() +
scale_x_continuous(limits = xlims) +
scale_y_continuous(limits = ylims)
# 第二个图
p2 <- ggplot(rwd, aes(displ, hwy, colour = class)) +
geom_point() +
scale_x_continuous(limits = xlims) +
scale_y_continuous(limits = ylims)
# 显示图形
p1
p2
这段代码首先计算了两个子集中
displ
和
hwy
的范围,然后在两个图中使用
scale_x_continuous
和
scale_y_continuous
函数设置相同的坐标轴范围,从而使两个图的坐标轴匹配。由于使用了相同的
colour = class
映射,图例也会匹配。
14、填写表格中的问号:表达式为TRUE、FALSE、NA的情况,分别对应x、is.na(x)、!is.na(x)的值。
对于
x
:
TRUE
时对应值为非缺失值且为真的情况
FALSE
时对应值为非缺失值且为假的情况
NA
时对应值为缺失值
对于
is.na(x)
:
TRUE
时对应值为缺失值
FALSE
时对应值为非缺失值
不存在对应
NA
的情况
对于
!is.na(x)
:
TRUE
时对应值为非缺失值
FALSE
时对应值为缺失值
不存在对应
NA
的情况
15、以下管道操作的作用是什么?library(magrittr) x <- runif(100) x %>% subtract(mean(.)) %>% raise_to_power(2) %>% mean() %>% sqrt()
该管道操作先生成100个均匀分布的随机数,接着将每个数减去其均值,然后对结果进行平方,再计算这些平方值的均值,最后对均值取平方根,即计算这100个随机数的标准差。
16、创建一个代表使用Blues ColorBrewer调色板的填充比例的对象。
可以使用
scale_fill_brewer(palette = "Blues")
来创建代表使用 Blues ColorBrewer 调色板的填充比例的对象,例如:
erupt + scale_fill_brewer(palette = "Blues")
bars + scale_fill_brewer(palette = "Blues")
(假设
erupt
和
bars
是已存在的绘图对象)
17、创建一个专门用于可视化连续分布的distribution()函数。允许用户提供一个数据集和要可视化的变量名称。让他们在直方图、频率多边形图和密度图之间进行选择。你可能还想包含哪些其他参数?
除了数据集、变量名和图形类型选择外,还可包含以下参数:
分箱宽度(binwidth),用于直方图和频率多边形图控制分箱大小;
颜色参数(colour 或 fill),用于区分不同组;
调整参数(adjust),用于密度图控制平滑程度;
x 轴范围(xlim);
是否显示图例(legend.position)。
18、为什么这段代码无法运行?如何修复它?代码如下:f <- function() { levs <- c(“2seater”, “compact”, “midsize”, “minivan”, “pickup”, “subcompact”, “suv”) piechart3(mpg, factor(class, levels = levs)) } f() #> Error in factor(class, levels = levs): object ‘levs’ not found
代码无法运行是因为 `factor(class, levels = levs)` 在执行时找不到 `levs` 对象。`levs` 是在 `f` 函数内部定义的局部变量,`factor` 函数在其自身的环境中找不到 `levs`。可通过将 `levs` 作为参数传递给 `piechart3` 或在全局环境中定义 `levs` 来解决问题。以下是一种解决思路,将 `levs` 作为参数传递:
```r
f <- function() {
levs <- c("2seater", "compact", "midsize", "minivan", "pickup", "subcompact", "suv")
piechart3_with_levs <- function(data, var, levs) {
piechart3(data, factor(var, levels = levs))
}
piechart3_with_levs(mpg, class, levs)
}
f()
19、如何向以下列表中的每个元素添加一个 geom_point() 图层?列表为 plots <- list(ggplot(mpg, aes(displ, hwy)), ggplot(diamonds, aes(carat, price)), ggplot(faithfuld, aes(waiting, eruptions, size = density)))
可以使用
lapply
函数来实现,代码如下:
plots <- lapply(plots, function(p) p + geom_point())
20、以下函数的作用是什么?它的更好名称是什么?mystery <- function(…) { Reduce(
+
, list(…), accumulate = TRUE) } mystery(ggplot(mpg, aes(displ, hwy)) + geom_point(), geom_smooth(), xlab(NULL), ylab(NULL))
+
该函数
mystery
的作用是将传入的参数依次累加,并返回累加过程的每一步结果。
它接收任意数量的参数,使用
Reduce
函数以
+
运算符对这些参数进行累加,并开启
accumulate
选项以保留每一步的累加结果。
对于
mystery
函数调用的示例,它创建了一个 ggplot2 图形,依次添加了散点图、平滑曲线,同时移除了 x 轴和 y 轴的标签。
更好的函数名可以是
cumulative_addition
或
stepwise_sum
等,这些名称更能清晰表达函数的功能。
21、列出五个可以用来获取更多关于 mpg 数据集信息的函数。
summary()、str()、head()、tail()、colnames()
22、如何了解 ggplot2 还包含哪些其他数据集?
可通过查看 ggplot2 官方文档、使用 R 语言中查看包数据集的函数(如
data(package = "ggplot2")
)来了解。
23、除美国外,大多数国家使用燃油消耗量(固定距离内消耗的燃油量)而非燃油经济性(固定燃油量行驶的距离)。如何将城市油耗(cty)和高速油耗(hwy)以英里每加仑为单位的值转换为欧洲标准的升/百公里(l/100km)?
转换公式为:升/百公里 = 235.215 / 英里每加仑。所以将
cty
和
hwy
的值分别代入该公式,即可得到对应的欧洲标准的燃油消耗量。
24、如何描述城市里程(cty)和公路里程(hwy)之间的关系?从相关情况得出结论是否有顾虑?
城市里程(cty)和公路里程(hwy)高度相关
两者都与气缸数(cyl)紧密相关
公路里程总是大于城市里程
随着城市里程增加,两者差值增大
25、ggplot(mpg, aes(model, manufacturer)) + geom_point() 会展示什么?它是否有用?如何修改数据使其更具信息量?
此代码会展示汽车型号与制造商的对应散点图。其有用性取决于分析目的,若用于查看两者关联可能有一定价值,但可能较难从中获取更多信息。
可添加颜色、大小等美学属性映射其他变量,如:
汽车销量
价格
或对数据分组、排序,以让图更具信息量。
26、尝试颜色、形状和大小这几个美学属性。当将它们映射到连续值时会发生什么?映射到分类值时呢?当在一个图中使用多个美学属性时会发生什么?
对于颜色,映射连续值有四种基于梯度的方法,映射离散值有两种方法;对于连续变量到颜色的映射,使用 HCL 颜色空间;对于分类变量“cyl”,将值映射到色轮上均匀间隔的色调。
27、使用 ggplot(mpg, aes(class, hwy)) + geom_boxplot() 绘图时存在一个问题,即 class 的排序是按字母顺序的,这没什么用。如何改变因子水平使其更具信息性?除了手动重新排序因子,还可以根据数据自动完成:ggplot(mpg, aes(reorder(class, hwy)), hwy)) + geom_boxplot()。reorder() 函数的作用是什么?
改变因子水平使其更具信息性可使用 reorder() 函数根据数据自动排序,而非手动重新排序因子。
28、探索钻石数据集中克拉变量的分布。哪种分箱宽度能揭示最有趣的模式?
可对克拉变量进行不同分箱宽度的试验来寻找有趣模式,例如可尝试缩小x轴范围并选择较小的分箱宽度(如
binwidth = 0.1
)以揭示更多细节。
29、探索钻石数据中价格变量的分布情况。价格分布如何随切割方式(cut)变化?
以下是将给定文本内容调整为Markdown格式的结果:
可使用
dplyr
的
group_by()
和
summarise()
函数按切割方式分组,计算价格的均值等统计量来探索分布差异。例如:
by_cut <- group_by(diamonds, cut)
sum_cut <- summarise(by_cut, price = mean(price))
此外,绘制相对价格图能看出钻石质量与相对价格的关系。推测切割方式作为质量因素之一,也会影响价格分布,高质量切割方式的钻石相对价格可能较高。
30、你现在知道(至少)三种比较子组分布的方法:geom_violin()、geom_freqpoly()和颜色美学,或者geom_histogram()和分面。每种方法的优缺点是什么?你还可以尝试哪些其他方法?
geom_violin()
能给出丰富展示,但依赖密度估计计算,较难解释;
geom_histogram()
和分面结合时,分面可使组间分离无重叠,在组重叠严重时较好,但难以看出小差异;
使用颜色美学时,组靠得近可能重叠,但小差异更易看出;
geom_freqpoly()
和直方图类似,能展示单数值变量分布,比箱线图提供更多信息,但需更多空间;
其他可尝试的方法可能有箱线图(
geom_boxplot
)、抖动图(
geom_jitter
)等。
31、想出三种可视化二维分类分布的方法,并通过可视化车型和制造商、变速箱和汽车类别、气缸数和变速箱的分布来尝试这些方法。
可推测的方法有:
使用
geom_violin()
,能展示不同类别下数据的分布形状,但依赖密度估计,较难解释;
使用
geom_freqpoly()
结合颜色美学,可对比不同类别分布,但可能因线条过多而混乱;
使用
geom_histogram()
和分面,能清晰展示各子组分布,但需较多空间。
32、安装babynames包,该包包含美国婴儿名字受欢迎程度的数据。运行以下代码
library(babynames); hadley <- dplyr::filter(babynames, name == "Hadley"); ggplot(hadley, aes(year, n)) + geom_line()
并修复生成的图表。分析为什么这个图表可能会让人不满意。
library(babynames); hadley <- dplyr::filter(babynames, name == "Hadley"); ggplot(hadley, aes(year, n)) + geom_line()
推测可能因图表存在数据展示不清晰、缺少必要标注、线条样式不佳等问题导致不满意。
可从以下方面修复:
添加标题
添加轴标签
添加图例
调整线条颜色
调整线条粗细
调整线条样式
33、掌握图形语法如何运作的最佳方法之一,是将其应用于对现有图形的分析。对于以下列出的每个图形,写下该图形的组成部分。如果你不知道ggplot2中对应的函数叫什么(甚至不知道它们是否存在),也不用担心,而是专注于记录图形的关键元素,以便你可以将其传达给其他人。1. 查尔斯·约翰·米纳德的《拿破仑的行军》:http://www.datavis.ca/gallery/re – minard.php 2. 《纽约时报》的杰里米·怀特、乔·沃德和马修·埃里克森的《热火队和雷霆队的投篮位置》:http://nyti.ms/1duzTvY 3. 詹姆斯·柴郡的《伦敦自行车租赁行程》:http://bit.ly/1S2cyRy 4. 皮尤研究中心2014年最喜欢的数据可视化作品:http://pewrsr.ch/1KZSSN6 5. 乔安娜·高在FiveThirtyEight上发表的《托尼奖从未如此被女性主导》:http://53eig.ht/1cJRCyG 6. 《纽约时报》的迈克·博斯托克、山·卡特、阿曼达·考克斯、马修·埃里克森、乔希·凯勒、艾丽西亚·帕尔拉皮亚诺、凯文·奎利和乔希·威廉姆斯的《在收入阶梯上攀升,地理位置很重要》:http://nyti.ms/1S2dJQT 7. 《纽约时报》的山·卡特、阿曼达·考克斯和迈克·博斯托克的《剖析预告片:电影中被选中的部分》:http://nyti.ms/1KTJQOE
图形的通用组成部分通常包含:
图层
:由几何元素和统计变换构成
几何对象:如点、线、多边形等
统计变换:如对数据进行分箱、计数等
尺度
:将数据空间的值映射到美学空间
如颜色、大小、形状
坐标系
:描述数据坐标如何映射到图形平面
分面规范
:描述如何将数据拆分为子集并以小倍数形式展示
主题
:控制显示细节
如字体大小、背景颜色