此博客作为自己的学习笔记,同时与大家交流分享!

Toolbox

首先我们来明确一下使用图层的目的是什么

  1. 显示数据(data):绘图时的最底层(数据层),显示数据有助于我们改进模型;
  2. 显示数据的统计摘要(statistical summary):在数据背景下展示模型的统计预测效果,模型层通常绘制在数据层之上,有助于揭示我们可能错过的数据的细微之处;
  3. 添加其他元数据(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))

生成图片:

  • vjusthjust :设置字体对齐方式。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():可强调图形中感兴趣的矩形区域。包括xminxmaxyminymax
  • 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()

生成图片:

如果要在此基础上添加个体数据轨迹,需要重新设置分组变量,由于此时 lineboxplot 分组变量不同,需要在各自图层中分别设置:

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:工具箱(一)基础图层、标签、注释、群组几何对象、曲面图相关推荐

  1. ggplot2学习笔记7:通过图层逐层构建图形

    Build a Plot Layer by Layer 5.1 介绍(Introduction) ggplot2背后的一个关键思想是,它允许轻松地迭代,一次一层地构建一个复杂的绘图.每个图层可以来自不 ...

  2. MATLAB学习笔记2:MATLAB基础知识(下)

    阅读前请注意: 1. 该学习笔记是华中师范大学HelloWorld程序设计协会2021年寒假MATLAB培训的学习记录,是基于培训课堂内容的总结归纳.拓展阅读.博客内容由 @K2SO4钾 撰写.编辑, ...

  3. J2EE学习笔记三:EJB基础概念和知识 收藏

    J2EE学习笔记三:EJB基础概念和知识 收藏 EJB正是J2EE的旗舰技术,因此俺直接跳到这一章来了,前面的几章都是讲Servlet和JSP以及JDBC的,俺都懂一些.那么EJB和通常我们所说的Ja ...

  4. java学习笔记15--多线程编程基础2

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note15.html,转载请注明源地址. 线程的生命周期 1.线程的生命周期 线程从产生到消亡 ...

  5. Linux 学习笔记之超详细基础linux命令 Part 3

    Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 2----------------- ...

  6. XML学习笔记01【xml_基础、xml_约束】

    Java后端 学习路线 笔记汇总表[黑马程序员] XML学习笔记01[xml_基础.xml_约束][day01] XML学习笔记02[xml_解析][day01] 目录 01 xml_基础 今日内容 ...

  7. 36篇博文带你学完opencv :python3+opencv学习笔记汇总目录(基础版)

    经过几天的学习,opencv基础部分学习完啦.整理出来. OpenCV opencv学习笔记1:图片读入,显示与保存(有代码) opencv学习笔记2:图像处理基础 opencv学习笔记3:像素处理 ...

  8. 《Go语言圣经》学习笔记 第三章 基础数据类型

    <Go语言圣经>学习笔记 第三章 基础数据类型 目录 整型 浮点数 复数 布尔型 字符串 常量 注:学习<Go语言圣经>笔记,PDF点击下载,建议看书. Go语言小白学习笔记, ...

  9. python表单提交的两种方式_Flask框架学习笔记之表单基础介绍与表单提交方式

    本文实例讲述了Flask框架学习笔记之表单基础介绍与表单提交方式.分享给大家供大家参考,具体如下: 表单介绍 表单是HTML页面中负责数据采集功能的部件.由表单标签,表单域和表单按钮组成.通过表单,将 ...

最新文章

  1. CentOS7入门_安装并配置mysql5.7.18
  2. java判断字符串是否包含日文
  3. 牵手高通的百度是要拿科大讯飞开刀了?
  4. python软件下载安装百度网盘-Python自动化测试视频教程【百度云盘下载】
  5. java jvm bind解决_java web项目启动的时候JVM_Bind,真的是tomcat端口被占用了吗?tomcat不同意...
  6. Endnote X8 #安装%办法与*安装*包%
  7. Windows下 Nginx创建文件服务器
  8. 运筹学及其matlab应用,运筹学基础及其MATLAB应用
  9. 18. OP-TEE中secur world和non-secure world的切换过程
  10. 车牌识别的matlab程序(程序_讲解_模板),车牌识别的matlab程序(程序-讲解-模板)资料...
  11. 什么是MBR/DPT/DBR/BPB?
  12. 图片转化为字符画——get!小技巧【美人图,动物照,有趣注释图案】
  13. Vpython cylinder-圆筒【圆柱】
  14. WebKit(WKScriptMessageHandler)
  15. 问题 A: 沙子的质量
  16. 牛客小白月赛28 B.牛牛和牛可乐的赌约2
  17. 微机原理与接口技术 重点详解与章节总结——8086微处理器系统结构
  18. Android 对接硬件串口篇
  19. windows下启动nginx闪退
  20. Python--序列化和反序列化

热门文章

  1. c++整蛊小程序(让他的鼠标不听使唤)医院wifi很快!
  2. 【Java笔记】集合(Collection接口)的使用
  3. 关于@Around、@Before、@After、@AfterReturning、@AfterThrowing执行顺序以及执行结果总结
  4. uCOSII任务就绪过程分析
  5. Nginx 配置文件详解(一)
  6. 自己设计计算机网络实验室,计算机网络实验室建设与实验教学改革路径
  7. 使用Java求1~100内所有素数的和
  8. QComboBox 简介
  9. CSDN排名靠前的大神:
  10. android图片、动画、画布学习