ggplot2绘图技巧与问题解答

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(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")

绘图可能会出现什么问题?如何修复它?

问题在于没有为形状设置对应的标签,仅为颜色设置了标签。修复方法是在

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()

并修复生成的图表。分析为什么这个图表可能会让人不满意。

推测可能因图表存在数据展示不清晰、缺少必要标注、线条样式不佳等问题导致不满意。

可从以下方面修复:

添加标题

添加轴标签

添加图例

调整线条颜色

调整线条粗细

调整线条样式

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

图形的通用组成部分通常包含:


图层

:由几何元素和统计变换构成

几何对象:如点、线、多边形等

统计变换:如对数据进行分箱、计数等


尺度

:将数据空间的值映射到美学空间

如颜色、大小、形状


坐标系

:描述数据坐标如何映射到图形平面


分面规范

:描述如何将数据拆分为子集并以小倍数形式展示


主题

:控制显示细节

如字体大小、背景颜色

© 版权声明

相关文章

暂无评论

none
暂无评论...