来源 | R友舍

对于研究过ggplot2的人而言,一个很奇怪的问题就是,为什么ggplot2做双坐标轴那么难?(解决方案可以参见Stack Overflow的这个问题。)

作者给出的理由

但事实上,作者并不建议使用双轴,这是他没有在ggplot2提供相关解决方案的原因,可以参见这个答案。

摘录如下:

It's not possible in ggplot2 because I believe plots with separate y scales (not y-scales that are transformations of each other) are fundamentally flawed. Some problems:

  • The are not invertible: given a point on the plot space, you can not uniquely map it back to a point in the data space.

  • They are relatively hard to read correctly compared to other options. See A Study on Dual-Scale Data Charts by Petra Isenberg, Anastasia Bezerianos, Pierre Dragicevic, and Jean-Daniel Fekete for details.

  • They are easily manipulated to mislead: there is no unique way to specify the relative scales of the axes, leaving them open to manipulation. Two examples from the Junkcharts blog: one, two

  • They are arbitrary: why have only 2 scales, not 3, 4 or ten?

You also might want to read Stephen Few's lengthy discussion on the topic Dual-Scaled Axes in Graphs Are They Ever the Best Solution?.

简单地翻译如下:

用ggplot2来话双轴是不可能(译者注:不过有其他ugly的解决方案),原因主要是因为我认为,双轴本身就是有严重缺陷的。这里例句一些可能的问题:

  • 与其他可替代的方式而言,双轴增加我们读图的难度。

  • 双轴更可能造成误导(有意或无意):我们有不止一种方式改变坐标轴,这使得这种(舆论)操纵得以可能。

  • 双轴的选择特别主观:为什么我们只选择双轴?不是3轴或4轴?

接下来,我们可以通过Hadley Wickham(什么?你不认识他?回去好好看doc吧!)提供的几个证据支持来更深入的理解为什么Hadley没有咋ggplot2里设置双轴这一看似平常的属性。

双轴使得读图难度增大(相对地)

Hadley引用的论文A Study on Dual-Scale Data Charts中介绍了四种双坐标图:

  • 一类称作切断图(cutout chart),这是一种可转为交互式的方案。图的下方为整个数据,上方为一个特别关注的某一区间段的数据。

  • 另一类为凸镜图(?,Lens Chart)。和切断图有点类似,但是往往是在一个子图中展现,只是某个区段的坐标会放大。

  • 另一类就是常见的叠加图(Superimposed Chart),也就是我们常规说的双坐标图。作者在上面举的例子就是Excel的方案(说好了不黑某软的)。

  • 最后一类被称为断轴图(Broken Chart)。这种图和切断图类似,区别是在于,断轴图是减去了部分信息然后再把轴拼起来的结果,所以理论上不会分为子图,且某个坐标的值会有断裂。

结果

这里不赘述具体作者如何实施实验的过程,只讲一下作者使用的结果。论文作者实际上就是将读图任务区分为判断位置长度斜率这三个任务,来判断受试完成三个任务所需要的时间,结果如下:

首先,直接可以看出人对三种数据可视化的基本元素的敏感程度是:位置优于长度优于斜率(这提示我们在散点、动力图时的方案,不过这是另一个问题了)。

其次,也是我们最关注的,我们可以发现,显然,叠加图的效果是最差的(没错,就是我们经常用的那种)。

最后,作者做出这5种图(包括普通单轴图)之间的错误、时间的显著性差异

这里不赘述了,图已经很好地说明问题。

双轴如何让我们误读的

我们来看以下两个用双轴坐标的例子。

例子一:bar图(柱状图)

下图是一个很常见的例子,我们想展现4种商品出口、内销额,如果直接采用Dodge型柱状图(不懂Dodge?Google一下,你会学得更多),会做出如下图。

这张图很好的表明,内销额明显高于出口额。但同时,这带来一个问题:因为出口额的量较小,放在内销的尺度下时,他们四者之间的比较不明显了。

一个常见的双轴解决方案如下:

Nice!我们可以看出出口额中四种商品之间的不同了。Wait a Minute!这带来个问题了,这张图强迫我们比较内销、出口额之间的差距,但显然,在这张图中,出口内销额之间的的高度是没有意义的。显然,这又不能让我们比较之间的差距。

我们可以得出以下结论:

项目 单轴 双轴
表现不同x坐标的差距 可以,但不够明显 可以
比较不同dodge之间数据的差距 可以 不可以
是否造成误读,或延长读图时间 不是

显然,我们可以得出结论,两个方案都有问题,但总的来说,单轴的优势更多,更不会引起误读,或者你具有绝对强大的内心和逻辑思维能力,但你却花了更多的时间用在“让自己做数据上的圣人上”。显然,优秀的设计不应该如此。

来看作者(略微UGLY)的解决方案(想省图看来是不可能的了):

例子二:折线图

这里,我们想要比较的销售额和销售单位随着月度变化的趋势,一个简单的例子就是画出下列的折线图

这张图处理上有三点需要注意:

  1. 采用双轴。

  2. 两个轴的起始值不为0。

  3. 有交点。

作者认为,这种图会强调折现交点的作用,而在这张图中,折线交点是完全没有意义的。

那,换成下面的方式呢?

显然,我们还会被迫去比较两个折线的高度,但在这里,高度是完全没有意义的,甚至,和销售额比(这点要强调),销售单位在某一时间段的降低也是没有意义的!!!

因此,综上所示,作者认为,双轴应该是不值得提倡的,还是换成一下原始的样子吧。

但如果实际情况中,我们还是需要比较这两者之间的互动怎么办呢?作者想到的一个方案是采用比例的方式,如下图:

双轴可以操纵读者!!!

双轴不仅可以通过以上方式误导读者,一个更可怕的内容是,双轴更可能涉及到数据行业的职业道德,因为,我们完全可以通过双轴,人为创造一些结论。

如Hadley引用的两个例子

本图来源

这是来自Friedman《世界是平的》中的例子,是想说明产油地区的自由程度和油价的关系。博客作者认为,这显然是有问题的,只要改变坐标轴,这个结论就会变化。

比如,这样

再比如这样

你可以做出多种方式,而每一种坐标的选择都导致你最后的结果不一样,包括变化的明显程度以及交点发生的时间。因此,我们甚至可以说,采用双轴是不道德的。

此外,还可以参见这个例子。

结论

  1. 双轴(指叠加图)会增加人读图的时间和困难(通过强迫读者进行一些无效比较)。

  2. 双轴导致混入分析师过多的主观性,坐标轴的尺度选择是随机的。

  3. 双轴可能会使读者产生错误的结论。

因此,在此,可以简单地做出结论,双坐标轴是应该被避免的。

—————————————

往期精彩:

  • 最担心的事情终于发生了,APP已经可以一键“脱掉”你的衣服了

  • 我造的假我自己打,Adobe推出“反PS”

  • 李彦宏被泼水,是“多数人的暴力”还是“群众的宣泄”

ggplot2设置坐标轴范围_ggplot2——双坐标轴?相关推荐

  1. matlab画图双坐标轴和多坐标轴代码

    matlab的绘图模块相比于其他软件要好看很多,可以使用句柄画出很漂亮的图,下面介绍plot画单坐标轴图和双坐标轴图,另附上多坐标轴图的代码下载 一.单坐标轴图 直接使用plot(x,y)即可,x为横 ...

  2. ggplot作图设置双坐标轴-各行其是

    很多时候我们做柱状图组合折线图,或者双变量折线图,这时候需要设置双坐标轴,如果两组数据数值相差太大,会使得图的展示不合理,设置双坐标轴,各自使用各自坐标,则会对比明显.双坐标轴作图prism和orig ...

  3. excel 设置双坐标轴柱状图

    思路:通过添加辅助列来调整. 步骤1 选中数据,插入柱状图,这时候会得到原始的柱状图 选中"设计"-"更改图表类型"-"组合",调整图表类型 ...

  4. python绘图设置时间坐标轴_Matplotlib绘图双纵坐标轴设置及控制设置时间格式

    双y轴坐标轴图 今天利用matplotlib绘图,想要完成一个双坐标格式的图. fig=plt.figure(figsize=(20,15)) ax1=fig.add_subplot(111) ax1 ...

  5. ggplot2绘制双坐标轴图

    R包ggplot2绘图精美,可以做出很复杂的图形,深受用户喜爱.它的作者hadley并不推荐使用ggplot2绘制双坐标轴图,认为这样会增加读图的难度,但是目前需要双坐标轴图应用的场景还是很多,如下图 ...

  6. ggplot2设置坐标轴范围_matplotlib画图教程,设置坐标轴标签和间距

    大家好,欢迎来到周四数据处理专题,我们今天继续matplotlib作图教程. 在上周的文章当中我们介绍了如何通过xlabel和ylabel设置坐标轴的名称,以及这两个函数的花式设置方法,可以设置出各种 ...

  7. python中pyecharts怎么设置坐标轴两边留白_《Python数据可视化之Matplotlib与Pyecharts》之双坐标轴图...

    10.6.1  双坐标轴图及其参数配置 双坐标轴图是一种组合图表,一般将两种不同类型图表组合在同一个"画布"上,如柱状图和折线图的组合:当然也可将类型相同而数据单位不同的图表组合在 ...

  8. R语言 双坐标轴组合图形可视化实现

    " 数据可视化过程中,经常遇到两种不同类型图表组合的情况,就是所谓的双坐标轴组合图.最近学习中遇到了此问题,特学习和大家分享,部分内容有个人改进哟" 01-​效果图 02-twoo ...

  9. R统计绘图-PCA分析及绘制双坐标轴双序图

    zhe 点击名片   关注我们 有师妹来咨询,怎样画类似于上图的双坐标轴PCA双序图.正好之前虽然PCA和RDA分析及绘图都写过教程,但是变量分析结果没有在图中显示,所以使用R统计绘图-环境因子相关性 ...

  10. LabVIEW图表之双坐标轴

    LabVIEW中波形图.波形图表.XY图都有双坐标轴的功能,如下是通过XY实现的一组曲线显示. 实现方法: 首先建立一个波形图控件,并在Y轴的刻度上右击(一定是刻度上右击,否则不会有相应的选项)如下图 ...

最新文章

  1. 计算机入域时域控用到的端口,AD域控制器使用端口的说明
  2. 使用JavaScript在下拉列表中获取选定的值
  3. 菜鸟级三层框架(EF+MVC)项目实战之 系列一 EF零基础创建领域模型
  4. 回复群邮件导致邮件服务器,电子邮件逐个发-邮件群发软件-使用手册
  5. sql 循环处理数据_图文介绍 SQL 的三种查询计划处理模型,Spark 用了其中两个
  6. 程序开发部门的“飞鸽传书”文件柜上面
  7. Oracle的10046事件
  8. java验证json合法性_java校验json字符串是否合法
  9. Java语言的特点和特性
  10. “参与 Debian 项目 20 年后,被降级的我选择退出”
  11. 求和(1,2,3.....n使其和为m的所有情况)
  12. 去oracle过程,记一次Oracle数据恢复过程
  13. [机器学习] 概念解析:从经验风险、结构风险到代价函数、损失函数、目标函数
  14. SVN报错之Failed to run the WC DB work queue associated with...的处理方法
  15. ubuntu 出错 /etc/sudoers is world writable
  16. 51单片机的矩阵键盘、跑马灯和呼吸灯设计
  17. Hi3559V100基本信息
  18. 2020 东京奥运会直播/回放观看途径
  19. 前端HTML CSS JavaScipt JQuery
  20. Jenkins系列:5、wsl下的Jenkins编译Windows下的Qt程序并自动打包成exe

热门文章

  1. SAP FICO 第三节 BDC和LTMC导入S4财务科目
  2. android怎么防8门神器,八门神器(GameKiller)怎么用?安卓版使用教程
  3. OpenCL优化案例研究 (4)
  4. 你不知道的智联招聘网功能?
  5. win10用win7的图片查看器
  6. 全志A64和瑞芯微RK3288参数对比介绍
  7. c语言的链表ppt,C语言链表详解ppt.ppt
  8. matlab三电平statcom无功检测双闭环svpwm调制两电平/三电平逆变器拓扑,pq无功电流检测模块
  9. Python如何抓取APP数据?抓包工具Fiddler介绍
  10. 阿里巴巴实习生笔试研发工程师