ggplot2学习笔记5:工具箱(一)基础图层、标签、注释、群组几何对象、曲面图
此博客作为自己的学习笔记,同时与大家交流分享!
Toolbox
首先我们来明确一下使用图层的目的是什么
- 显示数据(data):绘图时的最底层(数据层),显示数据有助于我们改进模型;
- 显示数据的统计摘要(statistical summary):在数据背景下展示模型的统计预测效果,模型层通常绘制在数据层之上,有助于揭示我们可能错过的数据的细微之处;
- 添加其他元数据(metadata):上下文、注释和引用。
1.基本绘图类型(Basic Plot Types)
几何对象是 ggplot2 的基本构建基块。它们本身很有用,也用于构造更复杂的图层。每个几何对象是二维的,需要 x 和 y 两个属性。
下面展示一些几何对象:散点图、含标签的散点图、条形图、色深图、线条图、面积图、路径图和多边形图,ggtitle()
函数是给图片添加标题。
df <- data.frame(x = c(3, 1, 5),y = c(2, 4, 6),label = c("a","b","c")
) #建立数据集p <- ggplot(df, aes(x, y, label = label)) +labs(x = NULL, y = NULL) + # 隐藏坐标标签theme(plot.title = element_text(size = 12)) #缩小绘图标题p + geom_point() + ggtitle("point")
p + geom_text() + ggtitle("text")
p + geom_bar(stat = "identity") + ggtitle("bar")
p + geom_tile() + ggtitle("raster")
p + geom_line() + ggtitle("line")
p + geom_area() + ggtitle("area")
p + geom_path() + ggtitle("path")
p + geom_polygon() + ggtitle("polygon")
生成图片:
图1:八种类型图
2.标签(Labels)
所用到的函数为geom_text()
,说白了就是把点换成了文本,参数有下面这些:
family
:可设置字体,下面代码中的"sans"
(默认字体),"serif"
,"mono"
代表三种字体;
df <- data.frame(x = 1, y = 3:1, family = c("sans", "serif", "mono"))
ggplot(df, aes(x, y)) + geom_text(aes(label = family, family = family))
fontface
:可设置粗体或斜体,“plain”
默认普通值, “bold”
粗体、 “italic”
斜体;
df <- data.frame(x = 1, y = 3:1, face = c("plain", "bold", "italic"))
ggplot(df, aes(x, y)) + geom_text(aes(label = face, fontface = face))
生成图片:
vjust
和hjust
:设置字体对齐方式。vjust
(“bottom”, “middle”, “top”, “inward”, “outward”);hjust
(“left”, “center”, “right”, “inward”, “outward”);最常用的路线之一是“inward”
:它将文本对齐到主画面的中间;
df <- data.frame(x = c(1, 1, 2, 2, 1.5),y = c(1, 2, 1, 2, 1.5),text = c("bottom-left", "bottom-right","top-left", "top-right", "center")
)
ggplot(df, aes(x, y)) +geom_text(aes(label = text))
ggplot(df, aes(x, y)) +geom_text(aes(label = text), vjust = "inward", hjust = "inward")
生成图片:
size
:设置字体大小;angle
:设置倾斜角度;nudge()
:设置文字距原坐标点的距离,避免在添加注释时,点和文字重合;
df <- data.frame(trt = c("a", "b", "c"), resp = c(1.2, 3.4, 2.5))
ggplot(df, aes(resp, trt)) +geom_point() +geom_text(aes(label = paste0("(", resp, ")")), size = 6, nudge_y = -0.25, angle = -45) + # y轴负方向下移0.25xlim(1, 3.6) # 设定x轴取值区间
生成图片:
check_overlap
:查找重复值。当注释中有大量重复时,设置check_overlap = TRUE
可以自动删除重复标签。
ggplot(mpg, aes(displ, hwy)) +geom_text(aes(label = model)) +xlim(1, 8)
ggplot(mpg, aes(displ, hwy)) +geom_text(aes(label = model), check_overlap = TRUE) +xlim(1, 8)
生成图片:
geom_label()
:与geom_text()
类似,它与geom_text()
的区别自动在文字后方绘制一个圆角矩形标签,当需要在复杂的背景上标注文字时可以使用;
label <- data.frame(waiting = c(55, 80),eruptions = c(2, 4.3),label = c("peak one", "peak two")
)
ggplot(faithfuld, aes(waiting, eruptions)) +geom_tile(aes(fill = density)) +geom_label(data = label, aes(label = label))
生成图片:
- 文本标签也可以替代图例。这通常使绘图更易于阅读,因为它使标签更接近数据。需要安装并加载
directlabels
包。
ggplot(mpg, aes(displ, hwy, colour = class)) +geom_point()#install.packages("directlabels")
library(directlabels)ggplot(mpg, aes(displ, hwy, colour = class)) +geom_point(show.legend = FALSE) +directlabels::geom_dl(aes(label = class), method = "smart.grid")
生成图片:
3.注释(Annotations)
注释可以在图形上添加新的元数据,可以使用下面这些函数:
geom_text()
:在指定点添加标签(见上文);geom_rect()
:可强调图形中感兴趣的矩形区域。包括xmin
,xmax
,ymin
,ymax
;geom_line()
;geom_path()
;geom_segment()
:在图形中添加线条;arrow()
可以用来添加箭头;geom_vline()
;geom_hline()
:向图形添加垂直线或水平线;geom_abline()
:向图形添加任意斜率和截距地直线。
下面我们根据economics数据集,画一幅失业人口的时间序列图:
ggplot(economics, aes(date, unemploy)) +geom_line(size = 1)
生成图片:
下面我们想在图中展现一下不同政党执政时期失业率的高低情况:
presidential_new <- subset(presidential, start > economics$date[1])
#数据集presidential包含了从1953年开始美国历届总统的执政起始时间ggplot(economics) +geom_rect(aes(xmin = start, xmax = end, fill = party),ymin = -Inf, ymax = Inf, alpha = 0.2,data = presidential_new) +geom_vline(aes(xintercept = as.numeric(start)),data = presidential_new,colour = "grey50", alpha = 0.5) +geom_text(aes(x = start, y = 2500, label = name),data = presidential_new,size = 3, vjust = 0, hjust = 0, nudge_x = 50) +geom_line(aes(date, unemploy)) +scale_fill_manual(values = c("blue", "red"))
生成图片:
如果想使用同样的方法在图形上添加一个单独的注释,有点复杂,我们必须先创建一个数据框:
economicsyrng <- range(economics$unemploy)
xrng <- range(economics$date)
caption <- paste(strwrap("Unemployment rates in the US havevaried a lot over the years", 40), collapse = "\n")
ggplot(economics, aes(date, unemploy)) +geom_line() +geom_text(aes(x, y, label = caption),data = data.frame(x = xrng[1], y = yrng[2], caption = caption),hjust = 0, vjust = 1, size = 4)
利用annotate()函数简化创建数据框过程:
ggplot(economics, aes(date, unemploy)) +geom_line(size = 1.0) +annotate("text", x = xrng[1], y = yrng[2], label = caption,hjust = 0, vjust = 1, size = 4)
# 查看?annotata(),将Examples演示一遍就清楚了
生成图片:
在对不同类别进行分面画图比较时,注释也是非常有用的。下面我们利用数据集diamonds
,画一个按照切割品质 cut
进行分面的关于钻石质量 carat
和价格 price
之间比较的2d热图:
ggplot(diamonds, aes(log10(carat), log10(price))) +geom_bin2d() +facet_wrap(~cut, nrow = 1)
生成图片:
对变量 log10(price)
与变量 log10(carat)
利用最小二乘法进行线性拟合:
mod_coef <- coef(lm(log10(price) ~ log10(carat), data = diamonds))
ggplot(diamonds, aes(log10(carat), log10(price))) +geom_bin2d() +geom_abline(intercept = mod_coef[1], slope = mod_coef[2],colour = "white", size = 1) +facet_wrap(~cut, nrow = 1)
生成图片:
4.群组几何对象(Collective Geoms)
在ggplot2中,几何对象可以大致分为个体(individual)几何对象和群组(collective)几何对象。
个体几何对象图为每个观测值(行)绘制不同的图形对象。集体几何对象图显示具有一个几何对象的多个观测值。
举例:数据集Oxboys(nlme包),记录了26名男孩(subject)在9个不同时期(occasion)所测定的身高(height)和中心化年龄(age)。
data(Oxboys, package = "nlme")
head(Oxboys) # head()函数仅展示数据集前六条观测
#> Subject age height Occasion
#> 1 1 -1.0000 140 1
#> 2 1 -0.7479 143 2
#> 3 1 -0.4630 145 3
#> 4 1 -0.1643 147 4
#> 5 1 -0.0027 148 5
#> 6 1 0.2466 150 6
多个分组与单一图形属性
在许多情况下,我们希望将数据分成多个组,但以相同的方式呈现它们。这在含有多个个体的纵向数据中很常见,叫“细面图”(spaghetti plot)。
例如,以下图显示了每个男孩的成长轨迹,就可以在映射 aes()
中添加参数 group = Subject
,相当于进行分组:
ggplot(Oxboys, aes(age, height, group = Subject)) +geom_point() +geom_line()
生成图片:
不同图层上的不同分组
如果我们想要将不同水平下的数据加以整合得到一个汇总信息,这时,基础图层上是每个个体的数据,我们可以在第二个数据层上展示整体组群的信息。
在上面的例子中,我们想根据所有男孩的年龄和身高在图中添加一个平滑线条,如果按照上面的方式,在第一层函数中直接添加 group = Subject
就会给每个男孩的线条上加一个平滑曲线,这不能得到我们想要的结果:
# 这幅图把26名男孩子9个不同时期的身高记录数据分别进行了拟合,没啥意义
ggplot(Oxboys, aes(age, height, group = Subject)) +geom_line() +geom_smooth(method = "lm", se = FALSE)
我们应该把设置分组变量的参数放在几何对象 line
层中,得到脚本如下:
# 这幅图把所有的数据进行了一次拟合,可以进行预测,意义非凡了就
ggplot(Oxboys, aes(age, height)) +geom_line(aes(group = Subject)) +geom_smooth(method = "lm", size = 2, se = FALSE)
生成图片:
修改默认分组
当离散变量存在时,一般就会将其认为是默认分组变量。
如果图像中含有离散型变量,而你却想绘制连接所有分组的线条。这时就要修改默认分组,或者利用 factor()
函数将数值型变量转化为字符型变量,再进行分组。
比如绘制各个测量时期(Occasion)身高(height)的箱线图为例,离散型变量 Occasion
默认为分组变量。
ggplot(Oxboys, aes(Occasion, height)) +geom_boxplot()
生成图片:
如果要在此基础上添加个体数据轨迹,需要重新设置分组变量,由于此时 line
和 boxplot
分组变量不同,需要在各自图层中分别设置:
ggplot(Oxboys, aes(Occasion, height)) +geom_boxplot() +geom_line(aes(group = Subject), colour = "#3366FF", alpha = 0.5)
脚本中 “#3366FF”
为蓝色的十六进制颜色编码,参数 colour
也可设为 colour = I(blue)
;想要查看具体的颜色编码和名称请查看常用十六进制颜色对照表和R语言颜色对照表。
生成图片:
匹配图形属性和图形对象
如何将个体的图形属性映射到整体图形的图形属性,有两种类型。
- 线段和路径(Lines and paths)
`当我们建立一个有三个点组成的数据集,画一幅线图,线的属性如何映射呢?数据点比线段条数多一,线段的图形属性是由起始点的图形属性决定的,所以第一条线段使用第一个数据点的图形属性,第二条线段使用第二个数据点的图形属性,而第三个点的图形属性将不会被用到。下面代码生成图片的颜色是随着数据点,呈现离散状态。
df <- data.frame(x = 1:3, y = c(2,1,3), colour = c(1,3,5))
c_new <- factor(df$colour)
ggplot(df, aes(x, y, colour = c_new)) +geom_line(aes(group = 1), size = 2) +geom_point(size = 5)
ggplot(df, aes(x, y, colour = colour)) +geom_line(aes(group = 1), size = 2) +geom_point(size = 5)
生成的两幅图形中,第一幅由于变量 colour
为离散型数据,三个点表现为三种不同的颜色;第二幅图形中,变量 colour
为连续型数据,三个点的颜色表现为渐变色。
补充说明:离散型、分类型、字符型三者等同;连续型、数值型二者等同。在颜色填充时,ggplot2会把离散型变量用不同颜色填充,连续型变量用渐变色填充,这也符合离散型变量与连续型变量的内在意义。
生成图片:
你可以想象一个更复杂的系统,利用 “线性插值法”
将段平滑地从一种图形属性混合到另一种图形属性。适用于连续变量(如大小或颜色),但不适用于离散变量,并且不用于 ggplot2 中。
df <- data.frame(x = 1:3, y = c(2,1,3), colour = c(1,3,5))
xgrid <- with(df, seq(min(x), max(x), length = 50))
interp <- data.frame(x = xgrid,y = approx(df$x, df$y, xout = xgrid)$y, # approx()是排序colour = approx(df$x, df$colour, xout = xgrid)$y
)ggplot(interp, aes(x, y, colour = colour)) +geom_line(size = 2) +geom_point(data = df, size = 5)
生成图片:
- 多边形(Polygons)
对于多边形这类几何图像,当所有个体的图形属性都相同时,可以使用 fill()
参数。当图形映射对象是离散型对象时,默认将群组几何对象分解成更小的部分。
耗油量数据集(mpg)中,如何用柱状图表示不同类别的汽车数量是相对容易的,但是在此基础之上如何按照drv(动力传动系统:前轮f,后轮r,四轮4)分类呢
mpgggplot(mpg, aes(class)) +geom_bar() +theme(axis.text.x = element_text(angle = 30))
ggplot(mpg, aes(class, fill = drv)) +geom_bar() +theme(axis.text.x = element_text(angle = 30))
生成图片:
如果根据连续型变量 hwy
(高速公路行驶记录每加仑行驶的英里数)填充 class
,如果不添加分组信息,则不会有不同颜色填充。如果在 fill()
后面添加 group()
参数,设置按 hwy
分组,就会有渐变色填充效果。
ggplot(mpg, aes(class, fill = hwy)) +geom_bar()
ggplot(mpg, aes(class, fill = hwy, group = hwy)) +geom_bar()
生成图片:
此时就可以看到,颜色越深代表高速公路行驶记录每加仑行驶的英里数越大。
5.曲面图(Surface Plots)
ggplot2 不支持真正的 3D 曲面。但是,它确支持许多以2D表示3D曲面的常见工具:等高线、着色瓦片图和气泡图。这些函数基本相似,仅在第三维度的图形属性上有所不同。
geom_contour()
:等高线图geom_raster()
:着色瓦片图
library(ggplot2)
faithfuld
# A tibble: 5,625 x 3eruptions waiting density<dbl> <dbl> <dbl>1 1.6 43 0.003222 1.65 43 0.003843 1.69 43 0.004444 1.74 43 0.004985 1.79 43 0.005426 1.84 43 0.005747 1.88 43 0.005928 1.93 43 0.005949 1.98 43 0.00581
10 2.03 43 0.00554
# ... with 5,615 more rows
根据faithfuld数据集,做等高线图和着色瓦片图:
ggplot(faithfuld, aes(eruptions, waiting)) +geom_contour(aes(z = density, colour = ..level..))
ggplot(faithfuld, aes(eruptions, waiting)) +geom_raster(aes(fill = density))
生成图片:
下面利用faithfuld数据集华气泡图,气泡图在较少的观测下效果更好。
# 使用faithfuld数据集十分之一的数据量
small <- faithfuld[seq(1, nrow(faithfuld), by = 10), ]
ggplot(small, aes(eruptions, waiting)) +geom_point(aes(size = density), alpha = 1/3) +scale_size_area()
生成图片:
往期笔记
- ggplot2学习笔记1:从qplot()开始
- ggplot2学习笔记2:ggplot()语法基础
- ggplot2学习笔记3:ggplot()基本用法
- ggplot2学习笔记4:绘制几何对象
参考资料:
- 书籍:《ggplot2:Elegant Graphics for Data Analysis》
- Hadley Wickham(2016). ggplot2. Springer International Publishing. doi: 10.1007/978-3-319-24277-4
ggplot2学习笔记5:工具箱(一)基础图层、标签、注释、群组几何对象、曲面图相关推荐
- ggplot2学习笔记7:通过图层逐层构建图形
Build a Plot Layer by Layer 5.1 介绍(Introduction) ggplot2背后的一个关键思想是,它允许轻松地迭代,一次一层地构建一个复杂的绘图.每个图层可以来自不 ...
- MATLAB学习笔记2:MATLAB基础知识(下)
阅读前请注意: 1. 该学习笔记是华中师范大学HelloWorld程序设计协会2021年寒假MATLAB培训的学习记录,是基于培训课堂内容的总结归纳.拓展阅读.博客内容由 @K2SO4钾 撰写.编辑, ...
- J2EE学习笔记三:EJB基础概念和知识 收藏
J2EE学习笔记三:EJB基础概念和知识 收藏 EJB正是J2EE的旗舰技术,因此俺直接跳到这一章来了,前面的几章都是讲Servlet和JSP以及JDBC的,俺都懂一些.那么EJB和通常我们所说的Ja ...
- java学习笔记15--多线程编程基础2
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note15.html,转载请注明源地址. 线程的生命周期 1.线程的生命周期 线程从产生到消亡 ...
- Linux 学习笔记之超详细基础linux命令 Part 3
Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 2----------------- ...
- XML学习笔记01【xml_基础、xml_约束】
Java后端 学习路线 笔记汇总表[黑马程序员] XML学习笔记01[xml_基础.xml_约束][day01] XML学习笔记02[xml_解析][day01] 目录 01 xml_基础 今日内容 ...
- 36篇博文带你学完opencv :python3+opencv学习笔记汇总目录(基础版)
经过几天的学习,opencv基础部分学习完啦.整理出来. OpenCV opencv学习笔记1:图片读入,显示与保存(有代码) opencv学习笔记2:图像处理基础 opencv学习笔记3:像素处理 ...
- 《Go语言圣经》学习笔记 第三章 基础数据类型
<Go语言圣经>学习笔记 第三章 基础数据类型 目录 整型 浮点数 复数 布尔型 字符串 常量 注:学习<Go语言圣经>笔记,PDF点击下载,建议看书. Go语言小白学习笔记, ...
- python表单提交的两种方式_Flask框架学习笔记之表单基础介绍与表单提交方式
本文实例讲述了Flask框架学习笔记之表单基础介绍与表单提交方式.分享给大家供大家参考,具体如下: 表单介绍 表单是HTML页面中负责数据采集功能的部件.由表单标签,表单域和表单按钮组成.通过表单,将 ...
最新文章
- CentOS7入门_安装并配置mysql5.7.18
- java判断字符串是否包含日文
- 牵手高通的百度是要拿科大讯飞开刀了?
- python软件下载安装百度网盘-Python自动化测试视频教程【百度云盘下载】
- java jvm bind解决_java web项目启动的时候JVM_Bind,真的是tomcat端口被占用了吗?tomcat不同意...
- Endnote X8 #安装%办法与*安装*包%
- Windows下 Nginx创建文件服务器
- 运筹学及其matlab应用,运筹学基础及其MATLAB应用
- 18. OP-TEE中secur world和non-secure world的切换过程
- 车牌识别的matlab程序(程序_讲解_模板),车牌识别的matlab程序(程序-讲解-模板)资料...
- 什么是MBR/DPT/DBR/BPB?
- 图片转化为字符画——get!小技巧【美人图,动物照,有趣注释图案】
- Vpython cylinder-圆筒【圆柱】
- WebKit(WKScriptMessageHandler)
- 问题 A: 沙子的质量
- 牛客小白月赛28 B.牛牛和牛可乐的赌约2
- 微机原理与接口技术 重点详解与章节总结——8086微处理器系统结构
- Android 对接硬件串口篇
- windows下启动nginx闪退
- Python--序列化和反序列化
热门文章
- c++整蛊小程序(让他的鼠标不听使唤)医院wifi很快!
- 【Java笔记】集合(Collection接口)的使用
- 关于@Around、@Before、@After、@AfterReturning、@AfterThrowing执行顺序以及执行结果总结
- uCOSII任务就绪过程分析
- Nginx 配置文件详解(一)
- 自己设计计算机网络实验室,计算机网络实验室建设与实验教学改革路径
- 使用Java求1~100内所有素数的和
- QComboBox 简介
- CSDN排名靠前的大神:
- android图片、动画、画布学习