• 44.2.1 cppFunction() 转换简单的C++函数—Fibnacci例子
  • 44.2.2 sourceCpp() 转换C++程序—正负交替迭代例子
  • 44.2.3 sourceCpp() 转换C++源文件中的程序—正负交替迭代例子
  • 44.2.4 sourceCpp() 转换C++源程序文件—卷积例子
  • 44.2.5 在Rmd文件中使用C++源程序文件
  • 45 R与C++的类型转换
  • 45.1 wrap() 把C++变量返回到R中
  • 45.2 as() 函数把R变量转换为C++类型
  • 45.3 as() wrap() 的隐含调用
  • 46 Rcpp 属性
  • 46.1 Rcpp属性介绍
  • 46.2 在C++源程序中指定要导出的C++函数
  • 46.3 在R中编译链接C++代码
  • 46.4 Rcpp属性的其它功能
  • 46.4.1 自变量有缺省值的函数
  • 46.4.2 允许用户中断
  • 46.4.3 把R代码写在C++源文件中
  • 46.4.4 在C++中调用R的随机数发生器
  • 47 Rcpp提供的C++数据类型
  • 47.1 RObject类
  • 47.2 IntegerVector类
  • 47.2.1 IntegerVector示例1:返回完全数
  • 47.2.2 IntegerVector示例2:输入整数向量
  • 47.3 NumericVector类
  • 47.3.1 示例1:计算元素 \(p\) 次方的和
  • 47.3.2 示例2: clone 函数
  • 47.3.3 示例3:向量子集
  • 47.4 NumericMatrix类
  • 47.4.1 示例1:计算矩阵各列模的最大值
  • 47.4.2 示例2:把输入矩阵制作副本计算元素平方根
  • 47.4.3 示例3:访问列子集
  • 47.5 Rcpp的其它向量类
  • 47.5.1 Rcpp的LogicalVector类
  • 47.5.2 Rcpp的CharacterVector类型
  • 47.6 Rcpp提供的其它数据类型
  • 47.6.1 Named类型
  • 47.6.2 List类型
  • 47.6.3 Rcpp的DataFrame类
  • 47.6.4 Rcpp的Function类
  • 47.6.5 Rcpp的Environment类
  • 48 Rcpp糖
  • 48.1 简单示例
  • 48.2 向量化的运算符
  • 48.2.1 向量化的四则运算
  • 48.2.2 向量化的二元逻辑运算
  • 48.2.3 向量化的一元运算符
  • 48.3 用Rcpp访问数学函数
  • 48.4 返回单一逻辑值的函数
  • 48.5 返回糖表达式的函数
  • 48.6 R与Rcpp不同语法示例
  • 49 用Rcpp帮助制作R扩展包
  • 49.1 不用扩展包共享C++代码的方法
  • 49.2 生成扩展包
  • 49.2.1 利用已有基于Rcpp属性的源程序制作扩展包
  • 49.2.2 DESCRIPTION文件
  • 49.2.3 NAMESPACE文件
  • 49.3 重新编译
  • 49.4 建立C++用的接口界面
  • 50 R编程例子
  • 50.1 R语言
  • 50.1.1 用向量作逆变换
  • 50.1.2 斐波那契数列计算
  • 50.1.3 穷举所有排列
  • 50.1.4 可重复分组方式穷举
  • 50.1.5 升降连计数
  • 50.1.6 高斯八皇后问题
  • 50.2 概率
  • 50.2.1 智者千虑必有一失
  • 50.2.2 圆桌夫妇座位问题
  • 50.3 科学计算
  • 50.3.1 城市间最短路径
  • 50.3.2 Daubechies小波函数计算
  • 50.3.3 房间加热温度变化
  • 50.4 统计计算
  • 50.4.1 线性回归实例
  • 50.4.2 核回归与核密度估计
  • 50.4.3 二维随机模拟积分
  • 50.4.4 潜周期估计
  • 50.4.5 ARMA(1,1)模型估计
  • 50.4.6 VAR模型平稳性
  • 50.4.7 贮存可靠性评估
  • 50.5 数据处理
  • 50.5.1 小题分题型分数汇总
  • 50.5.2 类别编号重排
  • 50.6 文本处理
  • 50.6.1 用R语言下载处理《红楼梦》htm文件
  • 51 使用经验
  • 51.1 文件管理
  • 51.1.1 文件备份
  • 51.1.2 工作空间
  • 51.2 程序格式
  • A R Markdown文件格式
  • A.1 R Markdown文件
  • A.2 R Markdown文件的编译
  • A.2.1 编译的实际过程
  • A.3 在R Markdown文件中插入R代码
  • A.4 输出表格
  • A.5 利用R程序插图
  • A.6 冗余输出控制
  • A.7 代码段选项
  • A.7.1 代码和文本输出结果格式
  • A.7.2 图形选项
  • A.7.3 缓存(cache)选项
  • A.8 章节目录链接问题
  • A.9 其它编程语言引擎
  • A.10 交互内容
  • A.11 属性设置
  • A.11.1 YAML元数据
  • A.11.2 输出格式
  • A.11.3 输出格式设置
  • A.11.4 目录设置
  • A.11.5 章节自动编号
  • A.11.6 Word输出章节自动编号及模板功能
  • A.11.7 HTML特有输出格式设置
  • A.11.8 关于数学公式支持的设置
  • A.11.9 输出设置文件
  • A.12 LaTeX和PDF输出
  • A.12.1 TinyTex的安装使用
  • A.12.2 Rmd中Latex设置
  • A.13 生成期刊文章
  • A.14 附录:经验与问题
  • A.14.1 Word模板制作
  • A.14.2 数学公式设置补充
  • B 用bookdown制作图书
  • B.1 介绍
  • B.2 一本书的设置
  • B.3 章节结构
  • B.4 书的编译
  • B.5 交叉引用
  • B.6 数学公式和公式编号
  • B.7 定理类编号
  • B.8 文献引用
  • B.9 插图
  • B.10 表格
  • B.10.1 Markdown表格
  • B.10.2 kable() 函数制作表格
  • B.10.3 R中其它制作表格的包
  • B.11 数学公式的设置
  • B.12 使用经验
  • B.12.1 学位论文
  • B.12.2 LaTeX
  • B.12.3 算法
  • B.12.4 中文乱码
  • B.12.5 图片格式
  • B.12.6 其它经验
  • B.13 bookdown的一些使用问题
  • C 用R Markdown制作简易网站
  • C.1 介绍
  • C.2 简易网站制作
  • C.2.1 网站结构
  • C.2.2 编译
  • C.2.3 内容文件
  • C.2.4 网站设置
  • C.3 用blogdown制作网站
  • C.3.1 生成新网站的框架
  • C.3.2 网页内容文件及其设置
  • C.3.3 初学者的工作流程
  • C.3.4 网站设置文件
  • C.3.5 静态文件
  • D 制作幻灯片
  • D.1 介绍
  • D.2 Slidy幻灯片
  • D.2.1 文件格式
  • D.2.2 幻灯片编译
  • D.2.3 播放控制
  • D.2.4 生成单页HTML
  • D.2.5 数学公式处理与输出设置文件
  • D.2.6 其它选项
  • D.2.7 slidy幻灯片激光笔失效问题的修改
  • D.3 MS PowerPoint幻灯片
  • D.4 Bearmer幻灯片格式
  • D.5 R Presentation格式
  • References
  • 编著:李东风
  • Healy, Kieran (2018). Data Visualization: A Practical Introduction. Princeton University Press. https://socviz.co/index.html 这本书讲了R的ggplot的使用, 也讲了一些可视化的一般性原则。
  • Claus O. Wilke(2019). Fundamentals of Data Visualization. O’Reilly Media. https://serialmentor.com/dataviz/ 这本书虽然也使用R的ggplot2包, 但正文中没有代码, 主要讲作图有哪些考虑、各种图形类型。 代码在github上可下载。
  • Winston Chang(2018). R Graphics Cookbook. O’Relly Media. 网站: https://r-graphics.org/ 为第二版。 讲了各种图的R程序。
  • Wickham, Hadley (2016). Ggplot2: Elegant graphics for data analysis. New York: Springer.
  • RStudio的ggplot2概览: data-visualization-2.1.pdf
  • Wickham的书主要需要安装tidyverse扩展包, 安装时会自动安装其它一些有关扩展包。 Healy的的书需要通过如下程序安装socviz软件包:

    关于什么是好的图形和坏的图形, William S. Cleveland, Edward R. Tufte等人有很多的研究。

    坏的图形可能有如下缺点:

  • 坏的品味。统计图形应该用尽可能少的图形元素表示尽可能多的数据, 从打印图形而言,即数据量与所用墨水比例越大越好。 没有必要的颜色、三维形态经常会影响读者对图形的认读。 这是Edward R. Tufte的观点, 但是过于极端也不好。
  • 坏的数据。 即使图形本身的做法没有问题, 选择了错误的或者不合适的数据也会误导读者, 甚至于用错误数据做的很专业的图形会比粗陋的图形更能误导读者。
  • 坏的感知。 不好的颜色选择、三维形状、坐标轴范围、宽高比都有可能对读者的认知有影响。
  • 作图时应考虑的一些因素:

  • 数值型变量的不同值可以表示为:

  • 同一坐标轴上的不同位置、
  • 不同轴上的位置、
  • 不同长度、
  • 不同角度或者斜率、
  • 不同面积、
  • 三维空间中的不同位置、
  • 颜色的不同明暗度、
  • 不同颜色饱和度、
  • 曲线的不同曲率、
  • 三维体积,
  • 这些表示的选择项越往后越难以被读者正确辨识。 使用颜色时,应该使用渐变的明暗度或者渐变色。

  • 分类变量的不同值可以表示为:

  • 不同分组、
  • 不同颜色、
  • 三维动态、
  • 不同符号。
  • 这些表示的选择项越往后越难辨识。 使用颜色时,应该使用明显不同的颜色而不应该使用渐变色。

  • 对于最少是零的变量, 是否应该以零作为坐标轴的最低值需要考虑, 但没有一定的规则。 同一组数据在不同的坐标范围或者长宽比下曲线的斜率会有很大差别。

  • 26.3 散点图:ggplot入门

    26.3.1 基本的散点图

    以gapminder数据集作为输入数据, 做出简单的散点图, 并逐步进行改善。 这个数据集有多个国家在多个年份的期望寿命与人均GDP值, 作期望寿命对人均GDP的散点图, 每个国家的每个年份作为一个点。 散点图最重要的映射是x轴与y轴两个维度。

    首先调用 ggplot() 函数, 指定数据集, 将人均GDP映射到x轴, 将期望寿命映射到y轴, 结果保存为一个R变量:

    指定数据集、指定映射、选择适当的图形类型就可以做出基本的图形, 随后可以逐步对坐标系、坐标系刻度、标签与图例、配色等进行改善。 实际上,ggplot2包已经提供了十分合理的预设值, 用户只要进行一些必要的改动即可。

    作图步骤之间用加号连接,这是ggplot包特有的语法。 用相同的映射做出拟合曲线图:

    ggplot() 函数的 mapping 参数的 aes() 设定中将变量映射到x、y轴, 颜色、符号、线型等图形元素类型, 也可以作为图形设置将某些图形元素设置为固定值。

    用不同颜色表示不同大洲, 就是将 continent 变量映射到 color :

    在前面的一个例图中, 在 ggplot() 函数中将 color fill 映射到了 continent 变量, 使得不仅散点颜色代表了不同大洲, 还使得每个大洲单独拟合了曲线。 如果希望所有大洲拟合同一条曲线怎么办?

    在必要时, 可以在 geom_xxx() 函数中用 mapping = aes(<...>) 单独指定变量映射。 下面的程序在 geom_point() 中将不同大洲映射为不同颜色, 而不影响 geom_smooth() 中的颜色以及分组:

    也可以将连续变量映射为渐变色。 除了表示二元函数的等值线图以外这种方法并不利于读者认读。

    将人口数取自然对数映射为渐变色:

    如果使用Rmarkdown制作图文, 图像会自动进入编译的结果(如PDF、Word、HTML)中, 图像大小、输出大小可以用Rmarkdown的设置调整。

    为了将最近生成的图形保存为PNG格式,用命令如

    26.4.1 图形中的分组和折线图

    考虑gapminder数据集中每个国家的期望寿命随时间(年)的变化。 用 geom_line() 可以画折线图。 因为有许多国家,所以仅指定x、y变量无法得到所需图形,如:

    我们编程找出寿命增长不稳定的国家。 这部分内容与作图关系不大,可以跳过。 对每个国家做线性回归, 以期望寿命为因变量, 以年份为自变量, 找出残差方差很大的,以及直线斜率为负的国家。

    前面所有国家的图包含了过多的曲线, 使得图形表现得很拥挤。 可以将一个作图区域拆分成若干个小块, 称为切片或者分面(facet), 按照某一个或两个分类变量的不同值将数据分为若干个子集, 每个数据子集分别在切片上作图。

    对于上面的例子, 可以将每个大洲的图形分别放置在一个切片上。 切片不是一种变量映射, 而是一种图形摆放方法, 所以不设置在 aes() 函数内, 而是用 facet_wrap() 函数规定。

    有些geom_xxx()函数直接按照数据值作图, 如geom_point()geom_line(), 而geom_smooth()这样的函数则会按照某种算法计算并对计算结果作图。 geom_xxx()都有默认的stat_xxx()函数用来计算, 也可以人为指定不同的统计规则。

    考虑条形图的例子。 ggplot2中的条形图函数geom_bar()可以对一个分类变量自动统计频数, 并作频数条形图。 比如对gss_sm数据集的bigregion变量作频数条形图:

    上面的条形图展现了单个分类变量的频数分布。 两个分类变量的交叉频数分布可以用分段条形图或者并列条形图表现。

    例如,对gss_sm数据集, 按照bigregion分组计算频数, 每组内再按照religion计算频数, 用tidyverse统计后作图如下:

    26.8.2

    datasets包的Titanic数据集包含了泰坦尼克号乘客更详细的信息。 我们按照存亡结果和舱位等级分切片作男女频数条形图:

    geom_col()不仅限于画频数或者比例的条形图, 此函数可以将一般用折线图表现的内容画成条形图, 但一定要注意一点:y坐标轴必须从0开始, 这也是geom_col()geom_bar()函数默认的设置。 如果坐标轴不从零开始, 则条形的长度就不能正确表示对应的y变量数值。

    举一个用条形图表示不是频数和比例的量的例子。 socviz包的oecd_sum数据集包含各年的美国以及OECD国家的期望寿命:

    26.7.1 绘图语法

    ggplot2的不仅仅是能够做一些固定格式的图形, 而是按照一种图形语法构建图形。 切片功能可以将数据集分成若干子集作多幅切片, 每幅切片中, 又可以分层, 每层有不同类型的图, 各层叠加显示在一起。 所以,分层语法作图结构如下:

  • 有一个主要的数据集, 以及从数据集变量到坐标位置、颜色、填充、大小、符号等的映射关系(aesthetics);
  • 有一到多个图层, 比如散点图和平滑曲线图层, 每个图层有几何对象、必要的统计变换、位置调整, 还可以有额外的数据集以及额外的映射关系;
  • 对每个映射关系有一个刻度(scaling), 对x、y维,一般需要线性变换,偶尔用到对数变换之类的其它变换, 颜色、填充等维度需要一些复杂的对应关系。 无特殊需要时只要使用默认刻度;
  • 有一个坐标系统, 如直角坐标系、极坐标系、球面坐标系等, 一般只要使用默认的坐标系统;
  • 可以划分切片(facetting)。
  • 利用绘图语法既可以做出常见的统计图形, 也可以做出各种新颖的图形, 就像语法正确的语句不一定有意义, 用绘图语法做的新颖图形不一定有实际意义, 还是要按照可视化的一般原则做出能说服读者的图形。

    26.7.2 图形种类

    geom_xxx() 提供了各种基本图形。 列表如下:

  • 基础图形:
  • geom_blank() 不画图,可以按映射的变量设定坐标范围;
  • geom_point() 每个观测为一个散点;
  • geom_hline() , geom_vline() , geom_abline() 画线;
  • geom_path() 每个观测提供 \((x,y)\) 坐标,在相邻观测之间连线;
  • geom_ribbon() 需要x和ymin, ymax维,在从小到大排序后的相邻观测之间连接阴影区域;
  • geom_segment() 需要x, y和xend, yend,为每个观测画一条线段;
  • geom_rect() 需要xmin, xmax, ymin, ymax,为每个观测画一个长方形,可有填充色;
  • geom_polygon() 需要x, y,将相邻观测连续并连接成一个闭合的多边形,中间填充颜色;
  • geom_text() 需要x, y和lable,每个观测画一条文字标签。
  • 单变量图层:
  • geom_bar() , geom_col() 作条形图;
  • geom_histogram() 对连续变量x作直方图;
  • geom_density() 对连续变量x作一元密度估计曲线;
  • geom_dotplot() 用原点作直方图;
  • geom_freqpoly() 用折线作直方图。
  • 两变量图形:
  • 两个连续变量x, y:
  • geom_point() 散点图;
  • geom_quantile() 拟合分位数回归曲线;
  • geom_rug() 在坐标轴处画数值对应的短须线;
  • geom_smooth() 画各种拟合曲线;
  • geom_text() 在指定的x, y位置画label给出的文字标签;
  • 显示二元分布:
  • geom_bin2d() 作长方形分块的二维直方图;
  • geom_density2d() 作二元密度估计等值线图;
  • geom_hex() 作正六边形分块的二维直方图。
  • 两个变量中有分类变量时:
  • geom_count() :重叠点越多画点越大;
  • geom_jitter() : 随机扰动散点位置避免重叠,数值变量有重叠时也可以用;
  • 一个连续变量和一个分类变量:
  • geom_col() 作条形图,对分类变量的每个值画一个条形,长度与连续变量值成比例;
  • geom_boxplot() 对每个类做一个盒形图;
  • geom_violin() 对每个类做一个小提琴图。
  • 一个时间变量和一个连续变量:
  • geom_area() 作阴影曲线图,曲线下方填充阴影色;
  • geom_line() 作折线图,在相邻两个时间之间连接线段;
  • geom_step() 作阶梯函数图,在相邻两个时间之间连接阶梯函数线。
  • 不确定性:
  • geom_crossbar() 对每个观测输入的x, y, ymin, ymax画中间有线的纵向条形;
  • geom_errbar() 对每个观测输入的x, ymin, ymax画纵向误差条;
  • geom_linerange() 对每个观测输入的x, ymin, ymax画一条竖线;
  • geom_pointrnage() 对每个观测输入的x, y, ymin, ymax画一条中间有点的竖线。
  • geom_map() : 用区域边界坐标数据画边界线地图。
  • 三个变量:
  • geom_contour() : 用输入的x, y, z数据画等值线图。
  • geom_tile() 用输入的x, y位置, width, height大小和指定的fill维画长方形色块填充图。
  • geom_raster() geom_tile() 的长方形大小相同时的快速版本。
  • 类似于散点图, 可以将指定的文字绘制在指定的坐标位置, 使用 geom_text(mapping = aes(label = 字符型变量))

    例如,gapminder数据集中各大洲的平均寿命与平均gdp的文字散点图:

    geom_text()添加文字时, 可以使用一些图形选项。

    可以用size选项(不是aes映射)指定字符大小, 单位为毫米。如:

    在坐标系中标注文字的功能更经常用来标出图形中的特殊点。

    考虑organdata中各国的平均捐赠率数据。 作平均捐赠率对平均gdp的散点图:

    可以用颜色来表示分组, 不同组的散点用不同颜色, 多条曲线用不同颜色; 可以用颜色表示数值, 用颜色深浅表示绝对值大小; 可以用颜色来突出某些要强调的图形元素。

    将变量值映射为颜色, 可以分为如下四种情况:

  • 无序的分类变量;
  • 有序的分类变量,仅有大小次序,没有正反;
  • 有序的分类变量,有正有反;
  • 连续数值变量。
  • 26.10.1 名义型变量的颜色

    将无序的分类值映射到颜色, 应该使用完全不相像、很容易区分的颜色, 各个颜色应该没有明显次序、没有哪一个与其他明显不同。 可以用RColorBrewer扩展包提供的调色盘, ggsci包也提供了一些调色盘。

    在ggplot2中用scale_color_brewer(palette)scale_fill_brewer(palette)选择RColorBrewer中的调色盘。 图26.1为无序分类适用的调色盘。 称这样的调色盘为名义型(qualitative)。

    色盲的人会分辨不出某些颜色, 比如红绿色盲的人无法分辨红色和绿色, 蓝绿色盲的人无法分辨蓝色和绿色。 男性中有8%的人有色盲, 所以绘图时应该考虑到这个问题。 (Wilke 2019)提供了8种对色盲也可区分的颜色:

    表26.1: 8种对色盲可区分的颜色 不同大洲使用不同的颜色, 指定ColorBrewer的Set1调色板:

    geom_tile()geom_rect()geom_raster()可以用颜色画长方块。 geom_tile()指定每个长方块的中心位置(x和y)、宽度(width)和高度, geom_rect()指定每个长方块的四个角的左右和上限坐标(xmin, xmax, ymin, ymax), geom_raster()geom_tile()在长方块大小相同时的快速版本。

    例如,表26.1中的颜色图:

    将连续的或者有序的值映射到颜色, 应该使用渐变色, 如果都是正值, 可以使用从浅到深或者从深到浅的颜色, 并且应该使用同一个颜色,只是深浅程度不同。 图26.2为单向的有序分类适用的调色板。 称这样的调色板为有序型(sequential)。

    图26.2: 有序单向分类适用的调色板

    可以将数值变量映射到颜色(color或者fill维), ggplot2可以自动选择映射关系, 也可以用scale_color_gradient()scale_color_gradient()函数自己指定一个渐变色, 只需要指定渐变色的lowhigh两段颜色, 一般需要用颜色代码表示, R扩展包colourpicker可以帮助挑选颜色。

    对于只取非负值的变量, 对应的渐变色应该是仅从浅到深或者从深到浅的, 使用默认参数调用scale_color_gradient()产生这种效果; 对于有正有负的变量, 就应该使用两种截然不同的颜色表示正负值, 用浅色表示接近0的值, 使用默认参数调用scale_color_gradient2()产生这种效果。

    26.11 标题、标注、指南

    除了ggplot()指定数据与映射, geom_xxx()作图, 还可以用许多辅助函数增强图形。

  • labs()可以设置适当的标题和标签。
  • annotate()函数可以直接在坐标系内进行文字、符号、线段、箭头、长方形的绘制。
  • guides()函数可以控制图例的取舍以及做法。
  • theme()函数可以控制一些整体的选项如背景色、字体类型、图例的摆放位置等。
  • 在需要修改图形时, 如果修改会影响到相应的geom_xxx()的主要结果, 一般需要在ggplot()或者该geom_xxx()函数中将适当的变量映射为某一维度, 或者用scale_xxx()函数进行变换。 如果仅仅是一些显示效果的修改, 则一般作为geom_xxx()的选项, 或者调用labs()theme()guides()完成。

    26.11.1 标题

    函数labs()可以用来指定图形上方的标题(title)、副标题(subtitle)、右下方的标注(caption)、左上方的标签以及坐标轴标题和其它维的名称。

    通过annotate(geom = "text")调用geom_text()的功能, 可以在一个散点图中标注多行文字, 多行之间用"\n"分开:

    对于颜色、填充色等维度, 会自动生成图例。 用guides(color = "none")这样的方法可以取消指定维度的图例。

    theme()可以调整一些整体的设置, 如背景色、字体、图例的摆放位置。 用theme()legend.position改变图例的位置, 如theme(legend.position = "top")可以将图例放置在上方, 默认是放置在右侧的。 可取值有"none""left""right""bottom""top",如:

    facet_wrap()facet_grid()可以按照某一个或两个分类变量的值将输入数据集分为若干个子集, 将每个子集分别在一个切片上绘图。 有时还需要将几幅不同图形拼在一起, 这些图形可以是同一数据的不同类型图形, 也可以是完全无关的图形。

    在拼接图形时, 各个切片应该具有类似的风格, 即背景、配色、字体等应该尽可能一致, 上下和左右的坐标轴应尽可能对齐, 切片的标签应该尽可能不显眼。

    patchwork和cowplot扩展包提供了方便的拼接功能。

    26.12.1 利用patchwork包拼接图形

    patchwork包提供了拼接图形的功能。 如果仅仅将几个图按照等分网格拼接, 可以用|表示左右拼接, 用/表示上下拼接。

    cowplot包也提供了拼接图形的办法, 使用时先将每个图分别赋值给一个R变量, 然后用plot_grid()函数摆放在一幅图中。

    19个学生的性别、年龄、身高、体重数据:

    ggplot2包作图可以实现内容与设计的分离, 这里内容就是指数据、映射、统计、图形类型等方面, 而设计就是指背景色、颜色表、字体、坐标轴做法、图例位置等的安排。 将作图任务分解为内容与设计两个方面, 可以让数据科学家不必关心设计有关的元素, 而设计可以让专门的艺术设计人才来处理。 这种工作分配已经在图书出版、网站、游戏开发等行业发挥了重要作用。

    theme()函数用来指定设计元素,称为主题(theme), 而且可以单独开发R扩展包来提供适当的主题。 ggthemes扩展包是一个这样的包。

    theme(legend.position)可以用来选择图例位置。 theme_set()可以改变后续ggplot2作图的主题(配色、字体等)。 如theme_set(theme_bw()), theme_set(theme_dark())等。 对单次绘图, 可以直接用加号连接theme_gray()等这些主题函数。 主题包括theme_gray()(默认主题)、 theme_minimal()theme_classic()等。

    ggplot2的默认设置一般能够满足我们的要求, 只有在有特殊的图形类型需求或者制作出版用的图形时, 才需要对图形进行定制调整。 图形调整可以包括:

  • 配色、位置摆放等审美方面的调整;
  • 面向目标出版物或者目标读者的调整;
  • 增加有意义的标注;
  • 调整整体的观感。
  • 26.14.1 图形逐步调整例子

    socviz扩展包的asasec数据集是美国社会学学会(ASA)的各分会2005年到2015年的一些数据, 其中的财务数据(Beginning, Revenues, Expenses, Ending)虽然各年都有值, 但实际是用2015年的值填进去的。

    作2014年收入对会员数的散点图与拟合曲线, 每个散点是一个分会: