如何绘制国旗?
今天是新中国70华诞,是全中国人民最重要的节日。在这个特殊的日子,作为一个伪码农,我选择了这样一种方式,表达对祖国最诚挚的爱。
1 准备工作
“工欲善其事,必先利其器。”作为一个R的重度发烧友,用R绘图是一项基本技能。我们通常的绘图思路是先构图,然后绘制。然而,自从tidyverse包出现后,绘图与数据分析就紧密结合在一起。可以说,图形只是数据的一种可视化方式,所以在绘图前做好数据处理工作是十分必要的。那么,如何构建绘图的数据呢?答案很简单,就是利用sf包,因为它能够提供一个基于WKT的几何图形数据格式(见Simple Features for R)。
接下来,我们需要了解五星红旗的绘制标准,包括:国旗(GB 12982-2004)和国旗颜色标准样品(GB 12983-2004)。看过标准后我才发现,看似简单的国旗其实有许多细节需要注意:五角星的大小、位置、角度、颜色以及红旗旗面的尺寸与颜色都是有讲究的。
在对绘图工具和绘图规范有了比较好的理解后,我们就可以着手绘图数据的设计与处理。
2 五角星和旗面绘制
如何绘制五角星和旗面?对于一个熟悉WKT格式的人来说,这个问题可以转化为一个数据问题。我们可以用LINESTRING(多段线)或者POLYGON(多边形)这两种格式来处理数据,也就是确定好五角星和旗面矩形的每个顶点的横纵坐标并按顺序排列即可。为了保证线条闭合,必须首尾的横纵坐标是一致的。
生产复杂表格的R软件包:tables
数据的输入输出一直是数据处理比较重要的问题。我们常见的数据表格的表头设计一般都比较复杂,存在着表头套表头的现象,而这种表格的结构对于一个数据分析软件来说是没法理解的。数据软件所能理解的表格是那种标准化的表格,也就是第一行是字段名(也就是变量名),从第二行到表格结束就是具体的内容(也就是变量的取值,或者叫实例)。这样除去第一行后,每一行表示一个实例(统计上叫一个观测,或者某个对象的属性),每一列表示一个变量的取值。如我们经常用到的iris数据表(为了简便,随机从每个Species类别中选取了1个数据):
| Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species |
|---|---|---|---|---|
| 4.8 | 3.1 | 1.6 | 0.2 | setosa |
| 5.6 | 2.9 | 3.6 | 1.3 | versicolor |
| 5.7 | 2.5 | 5.0 | 2.0 | virginica |
实际上,在R中我们一般以data.frame的形式储存数据,实际上所面对的就是上面这种数据表格。这种数据表格对于编程人员来说很实用很方便,但对于一般人而言,就会觉得很不直观,比如我们将上面表格中的iris数据等价地变换一下,就会发现这样的问题:
| Species | Type | Shape | Value |
|---|---|---|---|
| setosa | Sepal | Length | 4.8 |
| versicolor | Sepal | Length | 5.6 |
| virginica | Sepal | Length | 5.7 |
| setosa | Sepal | Width | 3.1 |
| versicolor | Sepal | Width | 2.9 |
| virginica | Sepal | Width | 2.5 |
| setosa | Petal | Length | 1.6 |
| versicolor | Petal | Length | 3.6 |
| virginica | Petal | Length | 5.0 |
| setosa | Petal | Width | 0.2 |
| versicolor | Petal | Width | 1.3 |
| virginica | Petal | Width | 2.0 |
基于泰勒展开的不确定性传递
1 两个输入变量
假设随机变量\(Z\)是随机变量\(X\)和随机变量\(Y\)的函数,函数关系如下
\[Z=f(X,Y)\]
其中\(X\)和\(Y\)的均值分别为\(\overline{X}\)和\(\overline{Y}\),方差分别为\(D_{X}\)1和\(D_{Y}\),协方差为\(D_{XY}\)。对\(Z\)进行关于\(\overline{X}\)和\(\overline{Y}\)泰勒展开可以得到
\[Z=f(\overline{X},\overline{Y})+f_{X}^{\prime}(\overline{X},\overline{Y})(X-\overline{X})+f_{Y}^{\prime}(\overline{X},\overline{Y})(Y-\overline{Y})+o(X,Y)\]
如果忽略高阶项\(o(X,Y)\),那么根据随机变量求和的期望和方差计算公式
\[\mathbb{E}(X+Y)=\mathbb{E}(X)+\mathbb{E}(Y)\]
和
\[\text{var}(X+Y)=\text{var}(X)+\text{var}(Y)+2\text{cov}(X,Y)\]
可以得到\(Z\)的期望值与方差值分别如下
\[\overline{Z}=f(\overline{X},\overline{Y})\]
和
\[D_{Z}=f_{X}^{\prime}(\overline{X},\overline{Y})^{2}D_{X}+f_{Y}^{\prime}(\overline{X},\overline{Y})^{2}D_{Y}+2f_{X}^{\prime}(\overline{X},\overline{Y})f_{Y}^{\prime}(\overline{X},\overline{Y})D_{XY}\]