第一部分 探索
第1章 使用ggplot2进行数据可视化
1.1 简介
首先安装并加载R包(ggplot2)
if(!require('ggplot2'))install.packages('ggplot2')
library('ggplot2')
我们下面使用ggplot2去探索一个问题:大引擎汽车比小引擎汽车更耗油吗?
1.2 第一步
1.2.1 mpg数据框
该数据框是ggplot2内置的一个数据集供我们学习使用。可以自己查看下mpg数据集中包含哪些东西及结构:使用(?mpg)
mpg
#> # A tibble: 234 x 11
#> manufacturer model displ year cyl trans drv cty hwy fl class
#>
#> 1 audi a4 1.8 1999 4 auto(l5) f 18 29 p compa…
#> 2 audi a4 1.8 1999 4 manual(m5) f 21 29 p compa…
#> 3 audi a4 2 2008 4 manual(m6) f 20 31 p compa…
#> 4 audi a4 2 2008 4 auto(av) f 21 30 p compa…
#> 5 audi a4 2.8 1999 6 auto(l5) f 16 26 p compa…
#> 6 audi a4 2.8 1999 6 manual(m5) f 18 26 p compa…
#> # … with 228 more rows
以下整理了mpg数据集具体参数含义
名称 | 含义 |
---|---|
manufacturer | manufacturer name(车的制造商名称,如:奥迪) |
model | model name(车的型号,如:A6) |
displ | engine displacement, in litres(发动机排量即引擎大小,单位升) |
year | year of manufacture(车的制造年份) |
cyl | number of cylinders(汽缸数) |
trans | type of transmission(变速箱类型) |
drv | the type of drive train, where f = front-wheel drive, r = rear wheel drive, 4 = 4wd(驱动类型,f=前轮驱动,r=后轮驱动,4=四驱) |
cty | city miles per gallon(每加仑油在城市跑的里程数) |
hwy | highway miles per gallon(高速公路每加仑行驶里程数) |
fl | fuel type(燃料类型) |
class | "type" of car(汽车类型,如:轿车、suv等) |
1.2.2 创建ggplot图形
x轴放displ,y轴放hwy
ggplot(data = mpg)+
geom_point(mapping = aes(x = displ, y = hwy))
这图可以看出来引擎越大,同样体积的油跑的里程越少。即引擎越大越耗油(displ与hwy负相关)
在ggplot2中画图:
1、使用ggplot()函数开始绘图,该函数创建了一个坐标系,你可以在它上面添加图层。ggplot()第一个参数是data,即图中要使用的数据集。
2、向ggplot()中添加一个或多个图层就可以完成这张图了。函数geom_point()是向图中添加一个点层,这样就可以创建一张散点图了。这种叫做几何对象函数(geom function)。
3、每个几何对象函数(geom function)都有一个mapping参数。这个参数定义了如何将数据集中的变量映射为图形属性。mapping参数总和aes()函数成对出现,aes()函数的x参数和y参数分别指定了映射到x和y轴的变量。
ggplot2绘图理念为plot(图形)=data(数据集)+geometry(几何对象)+aesthetics(美学映射)
绘图模板:
# 将<>内的内容分别替换为数据集、几何对象函数和映射集合即可
ggplot(data = )+
(mapping = aes())
1.3 图形属性映射
本章首先要了解变量类型。
1、aes() 将图层中使用的每个图形属性映射集合在一起,然后传递给该图层的映射参数。
2、想要手动设置图形的属性,需要按照名称进行设置,将其作为几何对象函数的一个参数,即在函数aes()的外部进行设置
3、点的形状是一个数值。空心形状(0-14)的边界颜色由color决定;实心形状(15-20)的填充颜色由color决定;填充形状(21-24)的边界颜色由color决定,填充颜色由fill决定。
练习:
一、以下这段代码有什么错误?为什么点不是蓝色的?
ggplot(data = mpg) +
geom_point(
mapping = aes(x = displ, y = hwy, color = "blue")
)
把"blue"换成mpg中的变量drv对比看下
p1 <- ggplot(data = mpg) +
geom_point(
mapping = aes(x = displ, y = hwy, color = "blue")
)
p2 <- ggplot(data = mpg) +
geom_point(
mapping = aes(x = displ, y = hwy, color = drv))
p1+p2
第一个代码的错误就是我们本节开头的第2点所说的内容。
二、mpg 中的哪些变量是分类变量?哪些变量是连续变量?(提示:输入?mpg 来阅读这个数据集的文档。)当调用mpg 时,如何才能看到这些信息?
分类变量包括:manufacturer、model、trans、drv、fl、class
连续变量包括:displ、year、cyl、cty、hwy
有一个捷径:把变量映射给 shape 参数,如果是连续变量就会报错,分类变量就不会。
另外可以使用命令 View(mpg) 来查看mpg数据集。
三、将一个连续变量映射为 color、size 和 shape。对分类变量和连续变量来说,这些图形属性的表现有什么不同?
我们这里连续变量用year,分类变量用model;然后分别映射到color、size 和 shape。
(1)color
p1 <- ggplot(data = mpg) +
geom_point(
mapping = aes(x = displ, y = hwy, color = year)
)
p2 <- ggplot(data = mpg) +
geom_point(
mapping = aes(x = displ, y = hwy, color = model))
p1+p2
(2) size
p1 <- ggplot(data = mpg) +
geom_point(
mapping = aes(x = displ, y = hwy, size = year)
)
p2 <- ggplot(data = mpg) +
geom_point(
mapping = aes(x = displ, y = hwy, size = model))
p1+p2
## Warning message:
## Using size for a discrete variable is not advised.
这个警告的意思是我们把model这个离散型变量赋给size不建议(model明明是无序分类变量,不知道这里为啥提示它是离散型变量?)
(3)shape
p1 <- ggplot(data = mpg) +
geom_point(
mapping = aes(x = displ, y = hwy, shape = year)
)
# 错误: A continuous variable can not be mapped to shape
p2 <- ggplot(data = mpg) +
geom_point(
mapping = aes(x = displ, y = hwy, shape = model))
p2
连续型变量赋值给shape会报错,分类变量可以赋值给shape,但系统最多支持6中shape所以图中可以看到只显示了6种。
四、如果将同一个变量映射为多个图形属性,会发生什么情况?
ggplot(data = mpg) +
geom_point(
mapping = aes(x = displ, y = hwy, size = hwy, color = hwy))
信息出现了多余,图中点的大小和颜色深浅都可以反应每个车的hwy属性。
五、stroke 这个图形属性的作用是什么?它适用于哪些形状?(提示:使用?geom_point 命令。)
p1 <- ggplot(data = mpg) +
geom_point(
mapping = aes(x = displ, y = hwy),
shape = 0 # 0 代表空心正方形
)
p2 <- ggplot(data = mpg) +
geom_point(
mapping = aes(x = displ, y = hwy),
shape = 0 ,stroke = 3 # 0 代表空心正方形
)
p1 + p2
我们我可以看出参数stroke代表的是图形属性:边框的宽度。
六、如果将图形属性映射为非变量名对象,比如 aes(color = displ < 5),会发生什么情况?
ggplot(data = mpg) +
geom_point(
mapping = aes(x = displ, y = hwy, color = displ < 5))
颜色分为两类一类displ<5,另一类displ>=5。
1.4 常见问题
多google/bing//微信/语雀搜索找答案,你遇到的大多数问题,很多人早就遇到过并且有大神已经回复解答了。
1.5 分面
如果数据集种的变量是连续型变量我们可以通过映射的方式添加到图形属性即在aes()函数内写上。若变量是分类变量,那我们可以采用分面的方式,即显示数据子集的子图。
facet_wrap()第一个参数是一个公式,创建方式为~后面加一个变量名或vars(变量,变量,变量,。。。)
facet_grid()第一个参数是一个公式,创建方式为由~隔开的两个变量名或
练习:
一、如果使用连续变量进行分面,会发生什么情况?
ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy))+
facet_wrap(~cty)
按照连续型变量分别展示数据没什么意义。根本看不出数据分布的规律、
二、在使用facet_grid(drv ~ cyl) 生成的图中,空白单元的意义是什么?它们和以下代码生成的图有什么关系?
ggplot(data = mpg) +
geom_point(mapping = aes(x = drv, y = cyl))
ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy))+
facet_grid(drv ~ cyl)
空白代表此处没有对应的数据。两图是一一对应的关系,上图的每个点对应下图的每个面。
三、 以下代码会绘制出什么图? . 的作用是什么?
p1 <- ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy)) +
facet_grid(drv ~ .)
p2 <- ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy)) +
facet_grid(. ~ cyl)
p1 + p2
.代表不行这里分面。如:drv ~ .代表在行维度上以drv分面,列维度不分面。. ~cyl代表在行维度不分面,列维度以cyl分面。
四、查看本节的第一个分面图:
ggplot(mpg,aes(x = displ, y = hwy))+
geom_point()+
facet_wrap(~class, nrow = 2)
与使用图形属性相比,使用分面的优势和劣势分别是什么?如果有一个更大的数据集,你将如何权衡这两种方法的优劣?
优势:分类变量用分面属性可以更好的查看不同分类内数据之间的关系(xy之间的关系)
劣势:连续型变量用分面没必要,麻烦还没意义。
五、阅读?facet_wrap 的帮助页面。nrow 和ncol 的功能分别是什么?还有哪些选项可以控制分面的布局?为什么函数facet_grid() 没有变量nrow 和ncol ?
nrow代表分面的行数,ncol代表分面的列数。控制布局的选项可以自己看下帮助文档。
此处引用下语雀:Yq潜,这位老哥的解释,感觉很好。
网格型(facet_grid) 和封装型(facet_wrap) 。网格分面生成的是一个 2 维的面板网格, 面板的行与列通过变量来定义,封装分面则先生成一个 1 维的面板条块,然后再封装到 2 维中。(ggplot2 一书P(141) )可以看出 facet_grid() 本来就是一个二维的,故才会没有变量 nrow 和 ncol。
p1 <- ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy)) +
facet_grid(drv ~ cyl)
p2 <- ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy)) +
facet_wrap(drv ~ cyl)
p1+p2
左侧为facet_grid(drv ~ cyl),右侧为facet_wrap(drv ~ cyl)大家对比下就明白了。
六、在使用函数facet_grid() 时,一般应该将具有更多唯一值的变量放在列上。为什么这么做呢?
共用一个纵坐标,方便做互相间数据比较。
1.5 几何对象
局部映射>全局映射
练习:
一、在绘制折线图、箱线图、直方图和分区图(对照英文, 我觉得这里应该是面积图)时,应该分别使用哪种几何对象?
折线图:geom_line()
箱式图:geom_boxplot()
直方图:geom_histogram()
分区图:geom_area()
二、在脑海中运行以下代码,并预测会有何种输出。接着在R 中运行代码,并检查你的预测是否正确。
ggplot(
data = mpg,
mapping = aes(x = displ, y = hwy, color = drv)
) +
geom_point() + # 几何对象散点图
geom_smooth(se = FALSE) # 几何对象平滑数据,拟合曲线,不加置信区间
三、show.legend = FALSE 的作用是什么?删除它会发生什么情况?你觉得我为什么要在本章前面的示例中使用这句代码?
不加图注,删了就加上图注了默认出现在右侧。图太多冗余。
四、geom_smooth() 函数中的se 参数的作用是什么?
不添加曲线的置信区间
五、以下代码生成的两张图有什么区别吗?为什么?
p1 <- ggplot(data = mpg, mapping = aes(x = displ, y = hwy)) +
geom_point() +
geom_smooth()
p2 <- ggplot() +
geom_point(
data = mpg,
mapping = aes(x = displ, y = hwy)
) +
geom_smooth(
data = mpg,
mapping = aes(x = displ, y = hwy)
)
p1 + p2
没区别,映射一样,所以可以一起放到全局映射中。
六、 自己编写R 代码来生成以下各图。
p1 <- ggplot(data = mpg, mapping = aes(x = displ, y = hwy))+
geom_point(size = 5)+
geom_smooth(se = FALSE,size = 2)
p2 <- ggplot(data = mpg, mapping = aes(x = displ, y = hwy))+
geom_point(size = 5)+
geom_smooth(mapping = aes(group = drv),se = FALSE,size = 2)
p3 <- ggplot(data = mpg, mapping = aes(x = displ, y = hwy, color = drv))+
geom_point(size = 5)+
geom_smooth(se = FALSE,size = 2)
p4 <- ggplot(data = mpg, mapping = aes(x = displ, y = hwy))+
geom_point(mapping = aes(color = drv),size = 5)+
geom_smooth(se = FALSE,size = 2)
p5 <- ggplot(data = mpg, mapping = aes(x = displ, y = hwy))+
geom_point(mapping = aes(color = drv),size = 5)+
geom_smooth(mapping = aes(linetype = drv),se = FALSE,size = 2)
#stroke参数的意思是描边宽度,shape为点的类型,此处color跟在stroke后面所以代表描边颜色
p6 <- ggplot(data = mpg, mapping = aes(x = displ, y = hwy))+
geom_point(shape = 21, stroke = 3, color = 'white')+
geom_point(mapping = aes(color = drv),size = 3)
(p1+p2)/(p3+p4)/(p5+p6)
1.7 统计变换
diamonds数据集
名称 | 含义 |
---|---|
price | price in US dollars($326-$18823)价格 |
carat | weight of the diamond (0.2–5.01)重量:克拉 |
cut | quality of the cut (Fair, Good, Very Good, Premium, Ideal)切割的质量 |
color | diamond colour, from D (best) to J (worst)钻石的成色D-J:最好-最差 |
clarity | a measurement of how clear the diamond is (I1 (worst), SI2, SI1, VS2, VS1, VVS2, VVS1, IF (best))钻石的清晰度 |
x | length in mm (0–10.74)长 |
y | width in mm (0–58.9)宽 |
z | depth in mm (0–31.8)深度 |
depth | total depth percentage = z / mean(x, y) = 2 * z / (x + y) (43–79)总深度百分比 |
table | width of top of diamond relative to widest point (43–95)钻石顶部相对最宽点的宽度 |
练习:
一、stat_summary()函数的默认几何对象是什么?不使用统计变换函数的话,如何使用几何对象函数重新生成以上的图?
# 使用统计函数stat_summary来绘图,它的默认几何对象是geom_pointrange
ggplot(diamonds)+
stat_summary(aes(x = cut, y = depth),
fun.max = max,
fun.min = min,
fun = median)
# 下面使用geom_pointrange进行绘图
ggplot(diamonds)+
geom_pointrange(aes(x = cut, y = depth),
stat = 'summary', #统计变换改为summary,默认的idendity是不做处理
fun.max = max, #最大值
fun.min = min, #最小值
fun = median) #中位数
二、geom_col()函数的功能是什么?它和geom_bar()函数有何不同?
# 看geom_col()帮助文档原文是这么写的:If you want the heights of the bars to represent # values in the data, use geom_col() instead. geom_bar() uses stat_count() by default: # it counts the number of cases at each x position. geom_col() uses stat_identity(): # it leaves the data as is.
# 左图
p1 = ggplot(diamonds)+
geom_bar(aes(x = cut))
# 右图
p2 = ggplot(diamonds)+
geom_col(aes(x = cut, y = depth))
library(patchwork)
p1|p2
联系:两个函数都是用来做柱状图的。geom_col()的条柱高度可以代表数据集中某个变量的数值(即默认统计变换是stat_identity()); geom_bar()的条柱高度只能代表x轴每个位置的例数(即默认统计变换是stat_count())。
三、多数几何对象和统计变换都是成对出现的,总是配合使用。仔细阅读文档,列出所有成对的几何对象和统计变换。它们有什么共同之处?
太多了没列
四、stat_smooth() 函数会计算出什么变量?哪些参数可以控制它的行为?
查阅stat_smooth()的帮助文档(?stat_smooth())可以看到有一项(Computed variables)
所以该函数回计算出的变量为:
- y predicted value(预测值)
- ymin lower pointwise confidence interval around the mean(均值附近的下点置信区间)
- ymax upper pointwise confidence interval around the mean(均值附近的上点置信区间)
- se standard error(标准误差)
可以控制它的行为的参数:
- position 调整位置
- method smooth的方法或函数如:"lm", "glm", "gam", "loess" or a function(自定义函数)
- formula 在平滑函数中用的公式如:y ~ x, y ~ poly(x, 2), y ~ log(x). NULL by default, in which case method = NULL implies formula = y ~ x when there are fewer than 1,000 observations and formula = y ~ s(x, bs = "cs") otherwise.
- se 是否显示标准差
- ...
五、在比例条形图中,我们需要设定 group = 1,这是为什么呢?换句话说,以下两张图会有什么问题?
p1 <- ggplot(data = diamonds) +
geom_bar(mapping = aes(x = cut, y = after_stat(prop)))
p2 <- ggplot(data = diamonds) +
geom_bar(mapping = aes(x = cut, fill = color, y = after_stat(prop)))
library(pacthwork)
p1|p2
我们发现不加group=1这样系统回默认x轴每一个值都是1
p1 <- ggplot(data = diamonds) +
geom_bar(mapping = aes(x = cut, y = after_stat(prop),group = 1))
p2 <- ggplot(data = diamonds) +
geom_bar(mapping = aes(x = cut, fill = color, y = after_stat(prop),group = color))
p1|p2
p1加上group=1意思就是x轴所有值是1组,然后计算不同值(fair、good等)在这个组里占的比例
p2为什么不加group=1反而是加group=color呐?因为我们多了一个参数fill = color,所以我们图中的条带数是cutcolor即5×7=35个,所以x轴所有值有35个组。所以计算百分比应该是计算35个组的百分比,所以就是以颜色来计算百分比,即每组所有颜色的宽度相加代表这个组的值,然后除以所有组的所有颜色宽度相加的值。*
1.8 位置调整
所有图层均具有位置调整共来解决重叠的几何图形。通过使用geom或stat函数的position参数来覆盖默认值。
- position = "identity" 将每个对象值直接显示再图中,这样数据会有重叠,不适合展示结果
- position = "fill" 堆叠条形图每组条形图具有相同的高度,这样可以轻松比较各组间比例。(即堆叠百分比条形图)
- position = "dodge" 并列条形图
- position = "stack" 堆叠条形图(堆叠的是具体数值)
- position = "jitter" 数据随机抖动(一般用于散点图,可以避免点的重合)
if(!require("ggplot2"))install.packages("ggplot2")
if(!require("patchwork"))install.packages("patchwork")
library("ggplot2")
library("patchwork")
p0 <- ggplot(diamonds,aes(x= cut, fill = clarity))+
geom_bar()+
labs(title = "position_stack")
p1 <- ggplot(diamonds,aes(x= cut, fill = clarity))+
geom_bar(alpha = 0.2, position = "identity")+
labs(title = "position_identity")
# p1和p2修改位置参数的效果是一样的,只是写法不一样。
p2 <- ggplot(diamonds,aes(x= cut, color = clarity))+
geom_bar(fill = NA, position = position_identity())+
labs(title = "position_identity")
p3 <- ggplot(diamonds, aes(x = cut, fill = clarity))+
geom_bar(position = "fill")+
labs(title = "position_fill")
p4 <- ggplot(diamonds, aes(x=cut, fill = clarity))+
geom_bar(position = position_dodge())+
labs(title = "position_dodge")
pt <- (p0|p1|p2)/(p3|p4)
ggsave("Rplot.png",pt)
- p0默认位置参数为stack,即直接原始数据堆叠
- p1修改位置参数为identity,但是这样直接显示原始数据(都从x轴底部开始),造成了数据重叠不利于分析,所以使用了alpha参数,让图形透明化。
- p2修改位置参数为identity,这次采用直接将填充为无(即背景色),然后使用color参数给上线条颜色,这样也可以看出来每组内不同clarity的数量
- p3修改位置参数为fill,堆叠百分比条形图,有利于对比不同组内clarity的比例。
- p4修改位置参数为dodge,将每组条形依次并列放置,有利于轻松比较每个条形的数值。
回忆上一节绘制的mpg的displ和hwy的散点图会发现图中的点数是126个,但是数据集中有234个观测值
通过位置调整方式改为抖动即:“jitter”为每个数据点添加一个很小的随机抖动,可以让重叠的点分散开。因为操作很有用可以让我们看到真正的数据的聚集模式,所以ggplot2提供了一个geom_jitter()函数
ggplot(mpg,aes(displ, hwy))+
geom_point(position = position_jitter())
练习:
一、下图有什么问题?怎么改善?
ggplot(data = mpg, mapping = aes(x = cty, y = hwy)) +
geom_point()
点位重叠了,调整位置位jitter
ggplot(data = mpg, mapping = aes(x = cty, y = hwy)) +
geom_jitter()
二、geom_jitter() 使用哪些参数来控制抖动的程度?
width和height
使用?geom_jitter()查看帮助文档,原文的解释是:Amount of vertical and horizontal jitter. The jitter is added in both positive and negative directions, so the total spread is twice the value specified here.即正负方向都加了抖动值,默认是40%,所以实际抖动是0.8。观察下图
p1 <- ggplot(data = mpg, mapping = aes(x = cty, y = hwy)) +
geom_jitter()
p2 <- ggplot(data = mpg, mapping = aes(x = cty, y = hwy)) +
geom_jitter(width = 0.2,
height = 0.2)
p1+p2
三、对比geom_jitter() 与geom_count()。
p1 <- ggplot(data = mpg, mapping = aes(x = cty, y = hwy)) +
geom_jitter()
p2 <- ggplot(data = mpg, mapping = aes(x = cty, y = hwy)) +
geom_count()
p1+p2
对比图形可间,jitter为添加抖动,count为对重叠点进行重新计数并根据计数多少改变点的大小。
四、geom_boxplot() 函数的默认位置调整方式是什么?创建 mpg 数据集的可视化表示来演示一下。
?geom_boxplot查看默认位置调整方式是dodge2
ggplot(mpg,aes(x = drv, y = cty))+
geom_boxplot()
1.9 坐标系
默认坐标系是笛卡尔直角坐标系。
1、coord_flip可以交换x和y轴,这在你想把箱线图水平过来,或者x轴组名太长挤不开的时候很好用
p1 <- ggplot(mpg,aes(x= class, y = hwy))+
geom_boxplot()
p2 <- ggplot(mpg,aes(x= class, y = hwy))+
geom_boxplot()+
coord_flip()
p1+p2
2、coord_polar()函数使用极坐标系。
p0 <- ggplot(diamonds,aes(x = cut, fill = cut))+
geom_bar(width = 1)+ #将条带宽度设置为1,默认值是图形分辨率的90%
theme(aspect.ratio = 1)+ #参数aspect.ratio表示图形的纵横比我们设置为1
labs(x = NULL, y = NULL) #不显示x、y轴的标注即(cut和count字符)
p1 <- p0+coord_flip()
p2 <- p0+coord_polar()
p1+p2
练习:
一、使用coord_polar() 函数将堆叠式条形图转换为饼图。
p0 <- ggplot(diamonds,aes(x= cut, fill = clarity))+
geom_bar(width = 1)+
labs(x=NULL, y = NULL)+
theme(aspect.ratio = 1)
p1 <- p0+coord_polar()
p2 <- p0+coord_polar(theta = "y")
p0+p1+p2
对比两图差异,参数theta介绍:variable to map angle to (x or y),意思是:以哪个变量值映射到角度,默认值是x,所以中间图p1是五等分角度(因为x轴式cut,5个cut就5等分)。右边图改为了theta = "y"(即根据每个组计算的count数来映射到角度)
换一个饼图,我们把p0的位置参数改为fill即条带按百分比堆叠。这样画出来的饼图没有空白,因为每个组自己是1
p0 <- ggplot(diamonds,aes(x= cut, fill = clarity))+
geom_bar(width = 1, position = "fill")+
labs(x=NULL, y = NULL)+
theme(aspect.ratio = 1)
p1 <- p0+coord_polar()
p2 <- p0+coord_polar(theta = "y")
p0+p1+p2
二、labs() 函数的功能是什么?阅读一下文档。
?labs()阅读帮助文档,运行下示例代码就可以知道。
内置参数给图形修改各种名字,如:标题,子标题,右下角标注,给图形加字母标注,修改xy轴名字等。
三、coord_quickmap() 函数和 coord_map() 函数的区别是什么?
画地图用的,感觉自己应该用不要,所以没看,需要了再学吧。
四、下图表明城市和公路燃油效率之间有什么关系?为什么 coord_fixed() 函数很重要?geom_abline() 函数的作用是什么?
p1 <- ggplot(data = mpg, mapping = aes(x = cty, y = hwy)) +
geom_point() +
geom_abline() +
coord_fixed()
p2 <- ggplot(data = mpg, mapping = aes(x = cty, y = hwy)) +
geom_point() +
geom_abline()
p1+p2
?coord_fixed()第一参数ratio:aspect ratio, expressed as y / x。即y轴与x轴的比例。默认是1,自己绘图的时候为了使数据展现效果更美观时,可以对xy轴的比例进行一定的调整。其他参数自己看下帮助文档,很简单。
?geom_abline()查看帮助文档,运行示例代码。作用:添加一条参考线,可以用来比较数据差别怎么样。注意他不是拟合数据为一条趋势线。下图是geom_abline()和geom_smooth()区别
p1 <- ggplot(data = mpg, mapping = aes(x = cty, y = hwy)) +
geom_point() +
geom_abline()+
coord_fixed()
p2 <- ggplot(data = mpg, mapping = aes(x = cty, y = hwy)) +
geom_point() +
geom_smooth(method = "lm", se = FALSE)+
coord_fixed()
p1+p2
1.10 图形分层语法
ggplot2绘制图形的基本框架:
ggplot(data = ) +
(
mapping = aes(),
stat = ,
position =
) +
+
7个参数即<>内的内容:数据集、几何对象、映射集合、统计变换、位置调整、坐标系和分面模式。大部分情况下不需要全部提供,因为R提供了很多默认值。
最后,大家明白ggplot2的绘图原理即可,以后遇到什么图,查看帮助文档+Google就行,网上有很多大神写的代码~
部分参考:
https://www.yuque.com/erhuoqian/mudww7/ugt8l6#U7UV9
https://ggplot2.tidyverse.org/reference/
这个是R数据科学英文版的电子书,大家感兴趣可以看下:https://r4ds.had.co.nz/