搜索
查看: 363|回复: 14

[R] 小洁详解《R数据科学》--第一章ggplot2

[复制链接]

6

主题

22

帖子

170

积分

注册会员

Rank: 2

积分
170
发表于 2018-9-2 15:24:42 | 显示全部楼层 |阅读模式
本帖最后由 hijack 于 2018-9-4 19:36 编辑

1.mpg数据框
mpg是ggplot2的内置数据框。
数据框是变量(列)和观测(行)的矩形集合。
Fuel economy data from 1999 and 2008 for 38 popular models of car
234 行x 11列
1.manufacturer:生产商 15个
2.model:型号 38个
3.displ:引擎排量-L 35个,单位为升,小数
4.year:出厂年份
5.cly:汽缸数 4,5,6,8
6.trans:变速方式:10个
7.dry:驱动方式 f  r  4
8.cty :每加仑汽油能跑的公里数(城市)21个,整数
9.hwy:燃油效率:每加仑汽油能跑的公里数(高速路)单位英里/加仑,燃油效率高说明省油。 27个,整数。
10.fl:燃油类型,五个 p     r     e     d     c   
11.class:车型  七个 compact   midsize    suv        2seater    minivan   pickup    subcompact

关于mpg
(1)如何查看行列数和变量类型
[AppleScript] 纯文本查看 复制代码
mpg

(2)如何查看每列的含义
[AppleScript] 纯文本查看 复制代码
?mpg #查看帮助文档

(3)如何查看每列的非重复值及每个值的重复次数
[AppleScript] 纯文本查看 复制代码
#用dplyr包的distinct函数
p<-mpg
library(dplyr)
distinct(p,manufacturer) #manufacturer替换为其他列名。仅显示非重复值,不显示重复次数。
count(p,manufacturer) #显示出现次数

2.入门级绘图模板
[AppleScript] 纯文本查看 复制代码
ggplot(data = <DATA>) + 
  <GEOM_FUNCTION>(mapping = aes(<MAPPINGS>))

3.图形映射属性
基础作图
[AppleScript] 纯文本查看 复制代码
ggplot(data = mpg) + 
       geom_point(mapping = aes(x = displ, y = hwy))

(1)颜色color
[AppleScript] 纯文本查看 复制代码
ggplot(data = mpg) + 
  geom_point(mapping = aes(x = displ, y = hwy, color = class))

(2)大小size
[AppleScript] 纯文本查看 复制代码
ggplot(data = mpg) + 
  geom_point(mapping = aes(x = displ, y = hwy, size = class))

警告信息:`Warning: Using size for a discrete variable is not advised.`
discrete variable--离散型变量(因子、字符、逻辑值)
变量按其数值表现是否连续,分为连续变量和离散变量。离散变量指变量值可以按一定顺序一一列举,通常以整数位取值的变量。如职工人数、工厂数、机器台数等。--来自百度百科
(3)透明度和形状
[AppleScript] 纯文本查看 复制代码
# 将车型class映射给透明度
ggplot(data = mpg) + 
  geom_point(mapping = aes(x = displ, y = hwy, alpha = class))
# 将车型class映射给形状
ggplot(data = mpg) + 
  geom_point(mapping = aes(x = displ, y = hwy, shape = class))


警告信息
`Warning messages:
  1: The shape palette can deal with a maximum of 6 discrete values because more than
6 becomes difficult to discriminate; you have 7. Consider specifying shapes
manually if you must have them.
2: Removed 62 rows containing missing values (geom_point).`

自动分配形状只能显示6种,缺失62行是因为suv车型没有被分配到形状,未曾显示。用`count(mpg,class)`可以查看class为suv的确实是62个。

(4)手动设置图形属性
例:所有点设为蓝色
(注意:color="blue"在aes()外)
[AppleScript] 纯文本查看 复制代码
ggplot(data = mpg) + 
  geom_point(mapping = aes(x = displ, y = hwy), color = "blue")

手动设置需要设为有意义的值。
颜色:字符串,blue,red等
大小:单位mm
形状:数字编号表示
- 空心形状 0-14 color边框
- 实心形状 15-20 color填充
- 填充形状 21-24 color边框,和fill填充

(5)stroke-轮廓(笔者补充)
适用于散点图,21-24号形状
[AppleScript] 纯文本查看 复制代码
ggplot(data = mpg) + 
      geom_point(mapping = aes(x = displ, y = hwy, stroke = 3),shape=21)

5.分面
(1)依据单个变量分面 facet_wrap()
[AppleScript] 纯文本查看 复制代码
ggplot(data = mpg) + 
  geom_point(mapping = aes(x = displ, y = hwy)) + 
  facet_wrap(~ class, nrow = 2) #分两行展示

nrow指定分面后显示几行
ncol指定分面后显示几列
注意~分面依据必须是离散型变量。
(2)依据两个变量分面 facet_grid()
[AppleScript] 纯文本查看 复制代码
ggplot(data = mpg) + 
  geom_point(mapping = aes(x = displ, y = hwy)) + 
  facet_grid(drv ~ cyl)

不需要指定nrow和ncol。
(3)不想在行或列维度中分面,用.代替变量名
[AppleScript] 纯文本查看 复制代码
ggplot(data = mpg) + 
  geom_point(mapping = aes(x = displ, y = hwy)) + 
  facet_grid(. ~ cyl)

6.几何对象
也就是图的不同类型,如点图、折线图、直方图等。
(1)理解分组
将一个图形属性映射为一个离散型变量,ggplot2就会自动对数据进行分组来绘制多个几何对象。这种形式是隐式分组,不需要添加图例和区分特征。

[AppleScript] 纯文本查看 复制代码
ggplot(data = mpg) +
  geom_smooth(mapping = aes(x = displ, y = hwy))

将线性映射为drv(驱动方式,d,f,4)就会自动变成三条线型不同的线。
将颜色映射为drv,就会自动变成三条颜色不用的线。

[AppleScript] 纯文本查看 复制代码
#分组
ggplot(data = mpg) +
  geom_smooth(mapping = aes(x = displ, y = hwy, group = drv))
#隐式分组-线型
ggplot(data = mpg) +
  geom_smooth(
    mapping = aes(x = displ, y = hwy, linetype = drv),
  )
#隐式分组-颜色
ggplot(data = mpg) +
  geom_smooth(
    mapping = aes(x = displ, y = hwy, color = drv),
    show.legend = FALSE  #不显示图例
  )


(2)同一张图显示多个几何对象--局部映射和全局映射
--这里涉及到图层啦。
局部映射-映射只对改图层有效
有多个几何对象时,映射语句要重复多次,又丑又麻烦。

[AppleScript] 纯文本查看 复制代码
ggplot(data = mpg) + 
  geom_point(mapping = aes(x = displ, y = hwy)) +
  geom_smooth(mapping = aes(x = displ, y = hwy))

全局映射--对所有图层生效
[AppleScript] 纯文本查看 复制代码
ggplot(data = mpg, mapping = aes(x = displ, y = hwy)) + 
  geom_point() + 
  geom_smooth()

局部映射与全局映射冲突时,服从局部映射。例如:

[AppleScript] 纯文本查看 复制代码
library(dplyr) #小洁补充
ggplot(data = mpg, mapping = aes(x = displ, y = hwy)) + 
  geom_point(mapping = aes(color = class)) + 
  geom_smooth(data = filter(mpg, class == "subcompact"), se = FALSE)

原文代码中没有library,会发生报错哦~~~
`Error in class == "subcompact" :
comparison (1) is possible only for atomic and list types`
这个报错是因为filter函数出自dplyr包,不加载就不能用。显然作者并没有注意到~
ps:关于se=FALSE
se是standard error的缩写,se参数为拟合曲线添加标准误差带,也就是那个灰不啦叽的灰色背景带,默认是TRUE。

7.统计变换
(1)关于diamonds数据集 (笔者补充)
ggplot2内置数据集,包含53940颗钻石的信息。
carat:克拉
cut:切割质量
color:颜色等级
clarity:纯净度等级
depth:深度比例
table:钻石顶部相对于最宽点的宽度
price:价格
"x"       "y"       "z"      :长宽深
↑以上来自帮助文档`?diamonds`
(2)统计变换函数和几何对象函数
统计变换:绘图时用来计算新数据的算法叫做统计变换stat
geom_bar做出的图纵坐标为count,是计算的新数据。
geom_bar的默认统计变换是stat_count,stat_count会计算出两个新变量-count(计数)和prop(proportions,比例)。
[AppleScript] 纯文本查看 复制代码
demo <- tribble(
  ~cut,         ~freq,
  "Fair",       1610,
  "Good",       4906,
  "Very Good",  12082,
  "Premium",    13791,
  "Ideal",      21551
) #新建表格并赋值给demo

ggplot(data = demo) +
  geom_bar(mapping = aes(x = cut, y = freq), stat = "identity") #覆盖默认的统计变换,使用identity。
每个几何对象函数都有一个默认的统计变换,每个统计变换函数都又一个默认的几何对象。
用几何对象函数geom_bar作直方图,默认统计变换是stat_count.
[AppleScript] 纯文本查看 复制代码
ggplot(data = diamonds) + 
  geom_bar(mapping = aes(x = cut))
用统计变换函数stat_count做计数统计图,默认几何对象是直方图。
[AppleScript] 纯文本查看 复制代码
ggplot(data = diamonds) + 
  stat_count(mapping = aes(x = cut))

这两个代码做出的图片结果是一致的。两种方法没有优劣之分。
(3)显示使用某种统计变换的原因
- 覆盖默认的统计变换
直方图默认的统计变换是stat_count,也就是统计计数。当需要直接用原表格的数据作图时就会需要覆盖默认的。
- 覆盖从统计变换生成变量到图形属性的默认映射
直方图默认的y轴是x轴的计数。此例子中x轴是是五种cut(切割质量),直方图自动统计了这五种质量的钻石的统计计数,当你不想使用计数,而是想显示各质量等级所占比例的时候就需要用到prop。

[AppleScript] 纯文本查看 复制代码
ggplot(data = diamonds) + 
  geom_bar(mapping = aes(x = cut, y = ..prop.., group = 1))

这里group=1的意思是把所有钻石作为一个整体,显示五种质量的钻石所占比例体现出来。如果不加这一句,就是每种质量的钻石各为一组来计算,那么比例就都是100%,显示五根大黑柱子,实在是丑出新高度。
- 在代码中强调统计变换
以stat_summary为例。
[AppleScript] 纯文本查看 复制代码
ggplot(data = diamonds) + 
  stat_summary(
    mapping = aes(x = cut, y = depth),
    fun.ymin = min,
    fun.ymax = max,
    fun.y = median
  )

(小洁碎碎念:stat_summary的默认几何图形是geom_pointrange,而这个geom_pointrange默认的统计变换却是identity,如果你不知道其中猫腻,就会发现他俩代码竟然不可逆。。。一夫多妻的节奏呀。)
因此要用几何对象函数重复这个图形,则需要指定stat_summary。

[AppleScript] 纯文本查看 复制代码
ggplot(data = diamonds) +
  geom_pointrange(
    mapping = aes(x = cut, y = depth),
    stat = "summary",
    fun.ymin = min,
    fun.ymax = max,
    fun.y = median
  )

8.位置调整-position
在直方图中,颜色映射是由color和fill之分的,表示边框和填充。如果要设置无填充(也就是透明),则fill=NA。NA在数据框里表示空值。
(1)直方图之堆叠式-fill
堆叠式就是在基础条形图上添加第三个变量,将这个变量映射给fill,就会在每个条形中分出不同颜色且不同比例的矩形。

[AppleScript] 纯文本查看 复制代码
ggplot(data = diamonds) + 
  geom_bar(mapping = aes(x = cut,fill=clarity))

除了映射的方式以外,position参数设置位置调整功能。position="fill"也可以设置,但这样设置的每组堆叠条形具有相同的高度。

[AppleScript] 纯文本查看 复制代码
ggplot(data = diamonds) + 
  geom_bar(mapping = aes(x = cut, fill = clarity), position = "fill")

笔者补充:感觉这种堆叠方式并不如设置fill映射,因为他突出的是比例,每组之间数值的差异被忽略了。
(2)直方图之对象直接显示-identity

[AppleScript] 纯文本查看 复制代码
ggplot(data = diamonds, mapping = aes(x = cut, fill = clarity)) + 
  geom_bar(alpha = 1/5, position = "identity")
ggplot(data = diamonds, mapping = aes(x = cut, colour = clarity)) + 
  geom_bar(fill = NA, position = "identity")


书中23页identity设置透明度和无填充的图是错的!--我为这句话负责。
正确的是这样

(3)直方图之并列式-dodge

[AppleScript] 纯文本查看 复制代码
ggplot(data = diamonds) + 
  geom_bar(mapping = aes(x = cut, fill = clarity), position = "dodge")

(4)散点图之扰动-jitter
书中翻译为抖动,我认为扰动更精确。
以mpg的displ和hwy散点图为例
[AppleScript] 纯文本查看 复制代码
ggplot(data = mpg) + 
  geom_point(mapping = aes(x = displ, y = hwy))
在这个例子中,数据有234行,图中却只有126个点。这就是因为有些点是重叠的,图上虽然显示一个点,但其实是好几个点重叠成了一个。
jitter可以为点添加随机扰动,使重叠的点分散开。
position参数设为jitter的快速实现:geom_jitter()
除了geom_jitter外,geom_point也可以展示重叠点,会根据重叠点的个数调整大小。
(5)stack-堆叠

[AppleScript] 纯文本查看 复制代码
ggplot(series, aes(time, value, group = type)) +
  geom_line(aes(colour = type), position = "stack") +
  geom_point(aes(colour = type), position = "stack")

ggplot(series, aes(time, value, group = type)) +
  geom_line(aes(colour = type)) +
  geom_point(aes(colour = type))


设置position_stack(上)和不设置(下)的区别:




9.坐标系
(1)coord_flip翻转坐标系

[AppleScript] 纯文本查看 复制代码
ggplot(data = mpg, mapping = aes(x = class, y = hwy)) + 
  geom_boxplot() +
  coord_flip()

(2)coord_quickmap
为地图设置长宽比
此处需要加载maps包,否则会报错。

[AppleScript] 纯文本查看 复制代码
library(maps)
#如果报错则:install.packages("maps")
#library(maps)
nz <- map_data("nz")

ggplot(nz, aes(long, lat, group = group)) +
  geom_polygon(fill = "white", colour = "black")

ggplot(nz, aes(long, lat, group = group)) +
  geom_polygon(fill = "white", colour = "black") +
  coord_quickmap()


geom_polygon 是多边形图


(3)coord_polar 极坐标系

[AppleScript] 纯文本查看 复制代码
bar <- ggplot(data = diamonds) + 
  geom_bar(
    mapping = aes(x = cut, fill = cut), 
    show.legend = FALSE,
    width = 1
  ) + 
  theme(aspect.ratio = 1) +
  labs(x = NULL, y = NULL)
bar + coord_flip()
bar + coord_polar()


ps:习题中涉及的
(1)关于饼图/牛眼图/圆圈图

[AppleScript] 纯文本查看 复制代码
ggplot(mpg, aes(x = factor(1), fill = drv)) +
  geom_bar()
ggplot(mpg, aes(x = factor(1), fill = drv)) +
  geom_bar(width = 1) +
  coord_polar(theta = "y")


要点:
- 不分组,作为一个整体。
- 如果作图不设置width,饼图中间会出现一个白色圈圈。经测试发现width等于几在图上并没有区别,但是不设置却不行。
- theta是角度的意思。如果不设置这个参数就会得到牛眼图哈哈哈哈哈哈。


多圆圈图

[AppleScript] 纯文本查看 复制代码
ggplot(data = diamonds) +
  geom_bar(mapping = aes(x = cut, fill = clarity), position = "fill") +
  coord_polar(theta = "y")



(2)第三题
geom_abline:添加线条
coord_fixed:保证横纵坐标的标尺一致,线条呈45°角
10.完整的绘图模板

[AppleScript] 纯文本查看 复制代码
ggplot(data = <DATA>) + 
  <GEOM_FUNCTION>(
    mapping = aes(<MAPPINGS>),
    stat = <STAT>, 
    position = <POSITION>
  ) +
  <COORDINATE_FUNCTION> +
  <FACET_FUNCTION>


图形构建的过程
(1)数据集
(2)统计变换
(3)几何对象
(4)映射fill
(5)放置
(6)映射x/y















上一篇:p6, 1.2.4练习
下一篇:小白啃R数据科学
回复

使用道具 举报

7

主题

17

帖子

94

积分

注册会员

Rank: 2

积分
94
发表于 2018-9-2 16:42:16 | 显示全部楼层
杰根妹妹 发表于 2018-9-2 15:38
你好,变量类型怎么看? 数字表示的比如dispel、year、cyl、 year、cty、hwy之类的就是连续变量? manufact ...

You might also have noticed the row of three (or four) letter abbreviations under the column names. These describe the type of each variable:
  • int stands for integers.
  • dbl stands for doubles, or real numbers.
  • chr stands for character vectors, or strings.
  • dttm stands for date-times (a date + a time).

There are three other common types of variables that aren’t used in this dataset but you’ll encounter later in the book:
  • lgl stands for logical, vectors that contain only TRUE or FALSE.
  • fctr stands for factors, which R uses to represent categorical variables with fixed possible values.
  • date stands for dates.


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 2 反对 0

使用道具 举报

3

主题

6

帖子

56

积分

注册会员

Rank: 2

积分
56
发表于 2018-9-2 15:34:53 | 显示全部楼层
你好,r语言零基础,请问这部分内容对应英文书本(暂时买不到中文书本...)哪一章节内容呢?谢谢
回复 支持 反对

使用道具 举报

11

主题

25

帖子

108

积分

注册会员

Rank: 2

积分
108
发表于 2018-9-2 15:38:18 | 显示全部楼层
你好,变量类型怎么看? 数字表示的比如dispel、year、cyl、 year、cty、hwy之类的就是连续变量? manufacture、model、trans、drv、fl、class之类的就是分类变量?
回复 支持 反对

使用道具 举报

11

主题

25

帖子

108

积分

注册会员

Rank: 2

积分
108
发表于 2018-9-2 15:42:26 | 显示全部楼层
杰根妹妹 发表于 2018-9-2 15:38
你好,变量类型怎么看? 数字表示的比如dispel、year、cyl、 year、cty、hwy之类的就是连续变量? manufact ...

调用mpg时,怎么看到这些信息?
回复 支持 反对

使用道具 举报

7

主题

17

帖子

94

积分

注册会员

Rank: 2

积分
94
发表于 2018-9-2 16:37:29 | 显示全部楼层
冒刷 发表于 2018-9-2 15:34
你好,r语言零基础,请问这部分内容对应英文书本(暂时买不到中文书本...)哪一章节内容呢?谢谢 ...

http://r4ds.had.co.nz/data-visualisation.html#
应该是对应着英文第三章
回复 支持 反对

使用道具 举报

7

主题

17

帖子

94

积分

注册会员

Rank: 2

积分
94
发表于 2018-9-2 16:38:41 | 显示全部楼层
杰根妹妹 发表于 2018-9-2 15:42
调用mpg时,怎么看到这些信息?

glimpse(mpg)或者mpg
回复 支持 反对

使用道具 举报

11

主题

25

帖子

108

积分

注册会员

Rank: 2

积分
108
发表于 2018-9-2 20:33:24 | 显示全部楼层
李其龙 发表于 2018-9-2 16:42
You might also have noticed the row of three (or four) letter abbreviations under the column names ...

many thanks
回复 支持 反对

使用道具 举报

634

主题

1180

帖子

4008

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4008
发表于 2018-9-2 22:44:17 | 显示全部楼层
哇,简直不可思议,这么烂的编辑器你居然还能写这么多!!!
好厉害
你这个问题很复杂,需要打赏,请点击 http://www.bio-info-trainee.com/donate 进行打赏,谢谢
回复 支持 反对

使用道具 举报

6

主题

22

帖子

170

积分

注册会员

Rank: 2

积分
170
 楼主| 发表于 2018-9-3 08:21:50 | 显示全部楼层
本帖最后由 hijack 于 2018-9-3 08:23 编辑
冒刷 发表于 2018-9-2 15:34
你好,r语言零基础,请问这部分内容对应英文书本(暂时买不到中文书本...)哪一章节内容呢?谢谢 ...

百度搜R for Data Science有英文原版哦,这是第几章我题目都有写,中文第一章对应的应该是英文第三章,主要找ggplot
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|生信技能树    

GMT+8, 2018-9-22 04:32 , Processed in 0.121131 second(s), 30 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.