11.2.2 基于recharts包绘制动态交互图表
recharts包是一个用于可视化的R加载包,它提供了一套面向JavaScript库Echarts 2.0的接口。此包的目的是让R用户即便不精通HTML或JavaScript,也能用很少的代码绘制Echarts动态交互图表。如下代码展示了本包的基本语法:
其中iris是R自带的鸢尾花数据集。注意,通过browseVignettes(“recharts”)命令可以离线查看recharts手册,它包含recharts包的所有函数及其使用方法。
recharts包的建立基于htmlwidgets包之上,这样的优点是极大地节省了开发者管理JavaScript依赖包和处理不同类型输出文档(如Rmarkdown和shiny)的时间。用户使用recharts包创建动态交互图表,只需关注如何导入数据并设置好参数,后续的输出交由htmlwidgets包来处理,它可以自适应Rmarkdown、shiny以及R控制台/RStudio等多环境的输出。
recharts包的主函数是echartr()和echart()。recharts包旨在自动处理不同类型的数据。例如,若把一个数据框对象传入echart()函数,同时x,y变量均为数值型变量,则echart()函数会自动适配散点图,生成对应的坐标轴。当然,我们也可以在echart()函数中手动输入参数设置坐标轴。
1.使用recharts包绘制基础动图
下面以mtcars数据集为例,介绍如何使用recharts包绘制动图,读者可以将recharts包绘制的动图与ggplot2包绘制的静图进行比较,以了解它们的不同点。下面选择mtcars数据集中的wt(车重)和mpg(油耗)两个数据字段绘制基础动图(如图11-8所示),以了解它们的关联,代码如下:
图11-8 recharts包绘制基础动图示例
echartr()函数的基础语法如下:
上述函数的各项参数说明如下。
·data指定源数据,且数据对象必须是数据框格式。
·x是自变量,可以指定data数据框对象的一列或多列,数据类型可以是时间、数值、文本等。在直角坐标系里,x与x轴关联,在极坐标系中,x与极坐标关联。一般情况下,单坐标系可参考直角坐标系的示例,多坐标系可参考极坐标系的示例。
·y是因变量,可以指定data数据框对象的一列或多列,数据类型始终为数值型。
·series是分组变量,可以指定data数据框对象的某一列,进行运算时被视为因子,作为数据系列映射到图例。
·weight是权重变量,在气泡图、线图、柱形图中与图形大小关联。
·facet是分面变量,可以指定data数据框对象的某一列,进行运算时被视为因子,适用于多坐标系,facet的每个水平会生成一个独立的分面。
·t为时间轴变量,t变量一旦指定,就会生成时间轴组件。
·lat表示纬度,lng表示经度,可与lat共同用于地图、热力图的参数设置。
·type为图类型,默认为“auto”。type作为向量传入时,映射到series向量;作为列表传入时,映射到facet向量。
·subtype指图的亚类,默认为NULL。subtype作为向量传入时,映射到series向量;作为列表传入时,映射到facet向量。
2.修改recharts包绘制的基础动图的参数
recharts包绘制的动图与ggplot2包绘制的静图类似,均通过修改不同函数的参数实现对图表对象细节的修改。用户可以先将recharts包绘制的基础动图存储为一个对象,然后通过修改函数参数,不断完善图表细节。和ggplot2包绘制静图不同的是,recharts包对函数参数的修改需要用“%>%”串联。修改示例代码及输出动图(如图11-9所示)如下:
图11-9 recharts包修改基础动图参数输出示例
上述代码首先创建一个recharts对象,将mtcars对象赋值给chart对象;之后使用factor参数对mtcars数据框对象中的am数据字段(是否为手动挡)进行因子化处理,am字段转换为因子数据类型,其中,1为Automatic,0为Manual;最后在输出的动图中,以不同颜色对Automatic和Manual数据点进行标识。在此过程中,labels参数为Automatic和Manual两个因子指定了图例名称。
为了帮助用户进一步理解recharts包的图表数据结构特征,下面给出了recharts包的图表数据结构,如图11-10所示。
下面从四方面讲解recharts包绘图函数及其主要参数的设置。
(1)更改图元大小
用户可以调用setSeries函数对chart对象进行修改,改变序列1图元大小的代码及输出结果(如图11-11所示)示例如下:
图11-10 recharts包的图表数据结构
图11-11 recharts包更改图元大小示例
(2)添加数据标注
recharts包也提供了数据统计功能,用户可以调用函数add Mark Line()或者add MarkPoint()为char对象添加标注线或标注点。例如,如果希望了解两种车的最大油耗,用户可以通过调用add Mark Point()函数将两种车的最大油耗标记出来,示例代码及输出结果(如图11-12所示)如下:
由图11-12可以看到,手动挡车的最大油耗显著大于自动挡车的最大油耗,但是相比于油耗的最值,用户可能更加关注其均值。为此,用户可以调用add Mark Line()函数分别给两个数据系列添加均数标注线。示例代码及输出结果(如图11-13所示)如下:
图11-12 recharts包添加数据标注点示例
图11-13 recharts包添加数据标注线示例
(3)添加动图标题
用户也可以使用set Title()函数为动图添加主标题和副标题,示例代码及输出结果(如图11-14所示)如下:
默认情况下,set Title()函数的第一个参数为主标题,第二个参数为副标题,textStyle参数可以设置标题文字的格式。
(4)修改图例、图标和工具箱
用户还可以调用set Legend()函数修改图例的格式,修改图例文字颜色的示例代码及输出结果(如图11-15所示)如下:
图11-14 recharts包添加主、副标题示例
图11-15 recharts包修改图例文字颜色示例
上述代码中的参数show可以控制是否显示图例,默认为TRUE,若要取消可将其设为NULL。
值得注意的是,recharts包中修改图例和图标的函数不同。如果用户想要修改图标的样式,需要使用setSymbols()函数,示例代码及输出结果(如图11-16所示)如下:
工具箱的控制函数是set Toolbox(),用户可以通过参数show来设置是否显示工具箱以及工具箱的位置、格式、控件等。隐藏工具箱的代码示例及输出结果(如图11-17所示)如下:
图11-16 recharts包修改图标样式示例
图11-17 recharts包隐藏工具箱示例
(5)设置坐标轴
用户可以使用set XAxis()函数控制坐标轴。recharts包的坐标轴会根据数据自动调整,值得注意的是,chart的坐标轴并不是以0为起点的,用户可以手动设置坐标轴的起始位置。通过使用set XAxis()函数可以实现用户需要的任意坐标轴样式,set XAxis()函数的基本语法如下:
上述函数中,chart参数是图形对象;series参数是图形对象的系列;which参数是选择此函数作用的坐标轴对象;show参数控制坐标轴是否显示;name参数及name TextStyle参数控制坐标轴的名称及类型;min参数和max参数控制坐标的起止点。set XAxis()函数的参数纷繁复杂,此处仅列举若干比较重要的参数予以说明,更多参数的介绍可以查看recharts包的帮助文档。
使用多个函数对chart对象进行调整的代码示例及输出结果(如图11-18所示)如下:
除上述内容外,recharts包中还有其他可以控制图形细节的函数,本书只对其中一部分进行了说明,如果读者对recharts包感兴趣,可以通过网址http://madlogos.github.io/recharts/index_cn.html查阅其官方文档。另外,由于recharts包生成的是动态交互图表,而动态交互特性在静态页面中无法展现,因此,建议通过html页面展示recharts输出图表。
图11-18 使用多个函数修改chart对象示例