对于研究过 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种图(包括普通单轴图)之间的错误、时间的显著性差异
这里不赘述了,图已经很好地说明问题。
我们来看以下两个用双轴坐标的例子。
下图是一个很常见的例子,我们想展现4种商品出口、内销额,如果直接采用Dodge型柱状图(不懂Dodge?Google一下,你会学得更多),会做出如下图。
这张图很好的表明,内销额明显高于出口额。但同时,这带来一个问题:因为出口额的量较小,放在内销的尺度下时,他们四者之间的比较不明显了。
一个常见的双轴解决方案如下:
Nice!我们可以看出出口额中四种商品之间的不同了。Wait a Minute!这带来个问题了,这张图 强迫我们比较内销、出口额之间的差距 ,但显然,在这张图中,出口内销额之间的的高度是没有意义的。显然,这又不能让我们比较之间的差距。
我们可以得出以下结论:
项目 | 单轴 | 双轴 |
---|---|---|
表现不同x坐标的差距 | 可以,但不够明显 | 可以 |
比较不同dodge之间数据的差距 | 可以 | 不可以 |
是否造成误读,或延长读图时间 | 不是 | 是 |
显然,我们可以得出结论,两个方案都有问题,但总的来说,单轴的优势更多,更不会引起误读,或者你具有绝对强大的内心和逻辑思维能力,但你却花了更多的时间用在“让自己做数据上的圣人上”。显然,优秀的设计不应该如此。
来看作者(略微UGLY)的解决方案(想省图看来是不可能的了):
这里,我们想要比较的销售额和销售单位随着月度变化的趋势,一个简单的例子就是画出下列的折线图
这张图处理上有三点需要注意:
采用双轴。
两个轴的起始值不为0。
有交点。
作者认为,这种图会强调折现交点的作用,而在这张图中,折线交点是完全没有意义的。
那,换成下面的方式呢?
显然,我们还会 被迫 去比较两个折线的高度,但在这里,高度是 完全没有意义 的,甚至, 和销售额比 (这点要强调),销售单位在某一时间段的降低也是没有意义的!!!
因此,综上所示,作者认为,双轴应该是不值得提倡的,还是换成一下原始的样子吧。
但如果实际情况中,我们还是需要比较这两者之间的互动怎么办呢?作者想到的一个方案是采用比例的方式,如下图:
双轴不仅可以通过以上方式误导读者,一个更可怕的内容是,双轴更可能涉及到数据行业的职业道德,因为,我们完全可以通过双轴,人为创造一些结论。
如Hadley引用的两个例子
本图来源
这是来自Friedman《世界是平的》中的例子,是想说明产油地区的自由程度和油价的关系。博客作者认为,这显然是有问题的,只要改变坐标轴,这个结论就会变化。
比如,这样
再比如这样
你可以做出多种方式,而每一种坐标的选择都导致你最后的结果不一样,包括变化的明显程度以及交点发生的时间。因此,我们甚至可以说,采用双轴是 不道德 的。
此外,还可以参见 这个例子 。
双轴(指叠加图)会增加人读图的时间和困难(通过强迫读者进行一些无效比较)。
双轴导致混入分析师过多的主观性,坐标轴的尺度选择是随机的。
双轴可能会使读者产生错误的结论。
因此,在此,可以简单地做出结论,双坐标轴是应该被避免的。
Stephen Few, Perceptual Edge(2008). Dual-Scaled Axes in Graphs: Are They Ever the Best Solution? Visual Business Intelligence Newsletter .
Isenberg, P., Bezerianos, A., Dragicevic, P., & Fekete, J.-D. (2011). A Study on Dual-Scale Data Charts. IEEE TRANSACTIONS ON VISUALIZATION AND COMPUTER GRAPHICS, 17(12).