R数据科学--使用ggplot2进行数据可视化2

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,比例)。
# 每个几何对象函数都有一个默认的统计变换,每个统计变换函数都又一个默认的几何对象。
# 用几何对象函数geom_bar作直方图,默认统计变换是stat_count,
  diamonds
# A tibble: 53,940 x 10
   carat cut       color clarity depth table price     x     y     z
   <dbl> <ord>     <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl>
 1 0.23  Ideal     E     SI2      61.5    55   326  3.95  3.98  2.43
 2 0.21  Premium   E     SI1      59.8    61   326  3.89  3.84  2.31
 3 0.23  Good      E     VS1      56.9    65   327  4.05  4.07  2.31
 4 0.290 Premium   I     VS2      62.4    58   334  4.2   4.23  2.63
 5 0.31  Good      J     SI2      63.3    58   335  4.34  4.35  2.75
 6 0.24  Very Good J     VVS2     62.8    57   336  3.94  3.96  2.48
 7 0.24  Very Good I     VVS1     62.3    57   336  3.95  3.98  2.47
 8 0.26  Very Good H     SI1      61.9    55   337  4.07  4.11  2.53
 9 0.22  Fair      E     VS2      65.1    61   337  3.87  3.78  2.49
10 0.23  Very Good H     VS1      59.4    61   338  4     4.05  2.39
# ... with 53,930 more rows
  count(diamonds,cut) #显示出现次数
# A tibble: 5 x 2
  cut           n
  <ord>     <int>
1 Fair       1610
2 Good       4906
3 Very Good 12082
4 Premium   13791
5 Ideal     21551
  ggplot(data = diamonds) + 
  geom_bar(mapping = aes(x = cut))
image.png

用统计变换函数stat_count做计数统计图,默认几何对象是直方图。

ggplot(data = diamonds) +
stat_count(mapping = aes(x = cut))


image.png

这两个代码做出的图片结果是一致的。两种方法没有优劣之分。

(3)显示使用某种统计变换的原因

# 覆盖默认的统计变换
# 直方图默认的统计变换是stat_count,也就是统计计数。当需要直接用原表格的数据作图时就会需要覆盖默认的。

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。
image.png

覆盖从统计变换生成变量到图形属性的默认映射
直方图默认的y轴是x轴的计数。此例子中x轴是是五种cut(切割质量),直方图自动统计了这五种质量的钻石的统计计数,当你不想使用计数,而是想显示各质量等级所占比例的时候就需要用到prop。

ggplot(data = diamonds) + 
  geom_bar(mapping = aes(x = cut, y = ..prop.., group = 1))
image.png

这里group=1的意思是把所有钻石作为一个整体,显示五种质量的钻石所占比例体现出来。如果不加这一句,就是每种质量的钻石各为一组来计算,那么比例就都是100%,显示五根大黑柱子,实在是丑出新高度。

在代码中强调统计变换

以stat_summary为例。

ggplot(data = diamonds) + 
  stat_summary(
    mapping = aes(x = cut, y = depth),
    fun.ymin = min,
    fun.ymax = max,
    fun.y = median
  )
image.png

stat_summary的默认几何图形是geom_pointrange,而这个geom_pointrange默认的统计变换却是identity,如果你不知道其中猫腻,就会发现他俩代码竟然不可逆。。。)

因此要用几何对象函数重复这个图形,则需要指定stat_summary。

ggplot(data = diamonds) +
  geom_pointrange(
    mapping = aes(x = cut, y = depth),
    stat = "summary",
    fun.ymin = min,
    fun.ymax = max,
    fun.y = median
  )
image.png

8.位置调整-position

# 在直方图中,颜色映射是由color和fill之分的,表示边框和填充。如果要设置无填充(也就是透明),则fill=NA。NA在数据框里表示空值。
# (1)直方图之堆叠式-fill
# 
# 堆叠式就是在基础条形图上添加第三个变量,将这个变量映射给fill,就会在每个条形中分出不同颜色且不同比例的矩形。
ggplot(data = diamonds) + 
  geom_bar(mapping = aes(x = cut,fill=clarity))
image.png
# 除了映射的方式以外,position参数设置位置调整功能。position="fill"也可以设置,但这样设置的每组堆叠条形具有相同的高度。
ggplot(data = diamonds) + 
  geom_bar(mapping = aes(x = cut, fill = clarity), position = "fill")
image.png

(2)直方图之对象直接显示-identity

ggplot(data = diamonds, mapping = aes(x = cut, fill = clarity)) + 
  geom_bar(alpha = 1/5, position = "identity")
image.png
ggplot(data = diamonds, mapping = aes(x = cut, colour = clarity)) + 
  geom_bar(fill = NA, position = "identity")
image.png

书中23页identity设置透明度和无填充的图是错的!

正确的是这样

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

ggplot(data = diamonds) + 
  geom_bar(mapping = aes(x = cut, fill = clarity), position = "dodge")
image.png

(4)散点图之扰动-jitter

书中翻译为抖动,我认为扰动更精确。

# 以mpg的displ和hwy散点图为例
ggplot(data = mpg) + 
  geom_point(mapping = aes(x = displ, y = hwy))
image.png
# 在这个例子中,数据有234行,图中却只有126个点。这就是因为有些点是重叠的,图上虽然显示一个点,但其实是好几个点重叠成了一个。
# jitter可以为点添加随机扰动,使重叠的点分散开。
# position参数设为jitter的快速实现:geom_jitter()
# 除了geom_jitter外,geom_point也可以展示重叠点,会根据重叠点的个数调整大小。

(5)stack-堆叠 无

# 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翻转坐标系

ggplot(data = mpg, mapping = aes(x = class, y = hwy)) + 
  geom_boxplot() +
  coord_flip()
image.png

(2)coord_quickmap

# 为地图设置长宽比
# 此处需要加载maps包,否则会报错。
library(maps)
#如果报错则:install.packages("maps")
#library(maps)
nz <- map_data("nz")

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

geom_polygon 是多边形图

(3)coord_polar 极坐标系

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()
image.png
bar + coord_polar()
image.png

ps:习题中涉及的

(1)关于饼图/牛眼图/圆圈图

ggplot(mpg, aes(x = factor(1), fill = drv)) +
  geom_bar()
image.png
ggplot(mpg, aes(x = factor(1), fill = drv)) +
  geom_bar(width = 1) +
  coord_polar(theta = "y")
image.png
# 要点:
# 
# 不分组,只有一个因子型变量drv。
# 如果作图不设置width,饼图中间会出现一个白色圈圈。经测试发现width等于几在图上并没有区别,但是不设置却不行。
# 
# theta是角度的意思。如果不设置这个参数就会得到牛眼图哈哈哈哈哈哈。
# 
# 作者取名叫牛眼图
# 
# 多圆圈图

ggplot(data = diamonds) +
geom_bar(mapping = aes(x = cut, fill = clarity), position = "fill") +
coord_polar(theta = "y")

![image.png](https://upload-images.jianshu.io/upload_images/19009296-a5905f2362d5d6de.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

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

参考
R数据科学--详解ggplot2

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,378评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,356评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,702评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,259评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,263评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,036评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,349评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,979评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,469评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,938评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,059评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,703评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,257评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,262评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,501评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,792评论 2 345

推荐阅读更多精彩内容