什么是斜线图

斜线图,英文为Slopegraph,是近年来比较流行的数据可视化的表现形式,是反映不同观测对象在两个固定点,如今年和去年、某一事件之前和之后的数据变化(比如排名,百分比,数值等),或者两个不同的维度数据之间的联系,由于本质是折线图,所以制作斜线图的软件很多,最常用的是Excel、tableau、R语言等。

Edward Tufte在1983年的著作《The Visual Display of Quantitative Information》第一次提到了斜线图,2011年6月1日他在论坛里把这种表示方式正式命名为slopegraph。前期很少有人使用,不过近期使用多了起来。

先看看几个斜线图的实例。

这是FT所作的一个关于中国消费者抵制美国品牌商品态度的变化的斜线图。

这张是网易的一个斜线图,X轴有1990年和2017年两个时间点,Y轴按慢性病伤残调整寿命年排序,显而易见,很容易看出从1990年到2017年,哪些慢性病成为了主要死因,以及这些死因排序的变化情况。一般来说,斜线图适合时间跨度比较大的数据展示。

这张是引自stroytellingwithdata中一篇文章more on slopegraphs的图,展示的是一份调查数据不同分组情况变化的斜线图,X轴是两个分组,一个是整体的(Company),一个是整体中的一部分(Team X),Y轴是不同调查内容的得分情况,可以看出某项指标在总体和个体中所处于的地位以及变化情况。

什么时候用斜线图

在Edward Tufte6月1日的帖子里,他总结了slopegraph的用法:

“Slopegraphs compare changes over time for a list of nouns located on an ordinal or interval scale.”

意思就是Slopegraphs是用来比较不同时间的一组指标的变化

在用到折线图或柱状图数据可视化的情况,斜线图都是一种不错的选择。例如下面分别用柱状图和斜线图表示4个公司2018年和2019年收入情况。

柱状图表示:

或者:

用斜线图表示,如下

比较上面三个图表,显然斜线图更能给受众更加直观、清晰的可视数据。柱状图只是吧数据进行的展示,并没有在图中同时直观的展示出各公司收入的排名和收入变化的幅度,而斜线图上则把收入、排名、变化幅度都同时直观的展示出来了。

对比上面的柱状图和斜线图,最大的差别是柱状图的Y轴数值一般是从0开始,这也是在做折线图、柱状图的一个基本要求,如果不从零开始,就会放大变化的幅度。而斜线图的Y轴并不是从0开始的,所以更适合比较名次的变化或相对数值的变化,而不是绝对数值的变化。

怎么用R语言作斜线图

由于斜线图就是折线图的一种变形,所以,只要能够制作折线图的软件都能制作斜线图,这里介绍一下在R语言环境下制作斜线图的方法。

GitHub有一个R语言库项目:CGPfunctions,提供了制作斜线图的函数newggslopegraph()。上面的斜线图就是用这个函数做出来的。

库文件的安装详见网页说明,最新版本是0.5.8,包含了新增加的一些函数参数,这里只把这个函数的参数用中文解释一下。

用法:

newggslopegraph(
  dataframe, Times, Measurement, Grouping,
  Title = "No title given", SubTitle = "No subtitle given",
  Caption = "No caption given", XTextSize = 12, YTextSize = 3,
  TitleTextSize = 14, SubTitleTextSize = 10, CaptionTextSize = 8,
  TitleJustify = "left", SubTitleJustify = "left",
  CaptionJustify = "right", LineThickness = 1, LineColor = "ByGroup",
  DataTextSize = 2.5, DataTextColor = "black",
  DataLabelPadding = 0.05, DataLabelLineSize = 0,
  DataLabelFillColor = "white", WiderLabels = FALSE,
  ReverseYAxis = FALSE, ReverseXAxis = FALSE, RemoveMissing = TRUE,
  ThemeChoice = "bw"
  )

参数:

  • dataframe:一个数据框类型的数据组,tidy data格式。会检查一些基本的错误,如检查是否存在列名称。

  • Times:数据框中的一列数据名,表示X轴上不同分组,比如时间或类别,可以是一个有序的class,因子或字符。注意,如果这列数据是日期类型,则需用as.character()转换成字符类型。

  • Measurement: 数据框中的一列数据名,表示Y轴上不同的数值。一般为百分比、名次等,也可为数值,可接受的类型为整数或数值。如果数值不那么离散或集中,斜线图的表达会更完美。

  • Grouping:分组名,数据框中的一列数据,表示不同的分组

例如上面例子中用的数据框为:

data
##    company   year income
## 1 CompanyA 2018年    232
## 2 CompanyA 2019年    261
## 3 CompanyB 2018年    111
## 4 CompanyB 2019年    425
## 5 CompanyC 2018年    266
## 6 CompanyC 2019年    217
## 7 CompanyD 2018年    431
## 8 CompanyD 2019年    329

这是一个带列名称的数据框data,第一列就是Grouping,表明每个斜线的类别,第二列是Times,表明X轴上的两个时间点,第三列是“Measurement”,表明每列别对应X轴在Y轴上的位置。

  • Title:标题,可选,当Title = NULL时,没有标题,当Title = “”时,一个空标题,但在图形中占据位置。

  • SubTitle:副标题,可选,当SubTitle = NULL时,没有标题,当SubTitle = “”时,一个空标题,但在图形中占据位置。

  • Caption:说明文字,可选,当Caption = NULL时,没有标题,当Caption = “”时,一个空标题,但在图形中占据位置。

  • XTextSize:X轴分组的文字大小,可选,缺省大小为12,和Y轴的分组文字大小有不同比例。

  • YTextSize:Y轴分组的文字大小,可选,缺省大小为3,和X轴的分组文字大小有不同比例。

  • TitleTextSize:标题文字大小,可选,缺省大小为14。

  • SubTitleTextSize:副标题文字大小,可选,缺省大小为10。

  • CaptionTextSize:说明文字大小, 可选,缺省大小为8。

  • TitleJustify:标题位置,为“L”, “R” or “C” or use the hjust = notation from ggplot2 with a numeric value between ‘0’ (left) and ‘1’ (right)。

  • SubTitleJustify:副标题位置,为“L”, “R” or “C” or use the hjust = notation from ggplot2 with a numeric value between ‘0’ (left) and ‘1’ (right)。

  • CaptionJustify:说明文字位置,为“L”, “R” or “C” or use the hjust = notation from ggplot2 with a numeric value between ‘0’ (left) and ‘1’ (right)。

  • LineThickness:斜线线宽,可选,缺省值为1。

  • LineColor:斜线颜色。可以用一个向量给每个分组设置颜色,向量的长度应和分组的分类数相等,如果不足,则循环设置,如c(“gray”, “red”, “green”, “gray”)或者时带分组名称的向量 c(“CompanyA” = “gray”, “CompanyB” = “red”, “CompanyC” = “green”, “CompanyD” = “gray”),利用这一特性,可以绘制出不同颜色的斜线。

  • DataTextSize:Y轴数值字符大小,可选,缺省值为2.5。

  • DataTextColor:Y轴数值颜色,可选,缺省为黑色“black”,可以是“colors()”中颜色或16进制数“#FF00FF”。

  • DataLabelPadding:Y轴数值和外框的间距,缺省值为0.05。

  • DataLabelLineSize:Y轴数值外框的线宽,缺省值为0,即没有框。

  • DataLabelFillColor:Y轴数值框内的颜色,缺省值为“white”,可以是“colors()”中颜色或16进制数“#FF00FF”。

  • WiderLabels:logical, set this value to TRUE if your “labels” or Grouping variable values tend to be long as they are in the newcancer dataset. This setting will give them more room in the same plot size.

  • ReverseYAxis:反转Y轴,逻辑值,如果想改变Y轴的排序方式,可设置为TRUE,可以把第一名调整在顶层。

  • ReverseXAxis:反转X轴,逻辑值,想改变factor levels时,可设置为TRUE。

  • RemoveMissing:逻辑值,如果设置为TRUE,如果缺少一些数值,则响应的分组也会移除不显示。

  • ThemeChoice:主题选择,缺省主题为“bw”,其他的是“ipsum”, “econ”, “wsj”, “gdocs”, and “tufte”。

下面展示一个完整的函数参数以及创建的图形,注意,X轴和Y轴均倒置了。

newggslopegraph(
  data, year, income, company,
  Title = "This is Title", SubTitle = "This is subTitle",
  Caption = "This is Caption\nSecond line", XTextSize = 14, YTextSize = 4,
  TitleTextSize = 14, SubTitleTextSize = 12, CaptionTextSize = 10,
  TitleJustify = "L", SubTitleJustify = "R",
  CaptionJustify = "C", LineThickness = 2, 
  LineColor = c("CompanyD" = "seagreen","CompanyA" = "green",
                "CompanyB" = "tomato","CompanyC" = "orange"),
  DataTextSize = 4, DataTextColor = "red",
  DataLabelPadding = 0.2, DataLabelLineSize = 0.5,
  DataLabelFillColor = "gray", WiderLabels = FALSE,
  ReverseYAxis = TRUE, ReverseXAxis = TRUE, RemoveMissing = TRUE,
  ThemeChoice = "tufte"
  )

一般来说,斜线图是比较两个时间点或两组分类的数据可视图,但也可以用来比较多个时间点,但一般不要过多,一般三、四个,时间跨度最好大一些。如下图。

中国联通2018年四季度,2019年一、二季度业务数据的斜线图。