为什么著名的ggplot绘图包不支持双坐标轴
ggplot2是Hadley Wickham的心血之作,如果你已经深入的学习了R,你一定使用过三大神器:dplyr、reshape2、ggplot2。它们的作者就是这个号称“革新了R的人”,现在是Rstudio的首席科学家。Hadley家是统计世家,爸爸、姐姐都是统计出身,
ggplot2绘图原理来源于Leland Wilkinson的名著《Grammar of Graphics》,主要认为统计图形就是数据到点、线、面(方块)等几何图形及其属性(颜色、大小、形状)的映射,将映射加和一些统计变换绘制到某种坐标系中就是统计图形,Hadley读完后高山仰止,直接取了书名的缩写作为开发包的名字ggplot,Hadley一般开发一个升级包后,就会在原来的名字后加“2”,这就是ggplot2鼎鼎大名的来源。
ggplot2旨在吸取R另外两个绘图体系base和lattice的优点,去伪存精,成为更加易用、专业、艺术性的绘图系统,现在已经成为了R三大绘图体系最出名的一个。但是这些都不能说明ggplot2是一个有态度的包,所谓态度就是对某一事物深深的执念。ggplot2摆出了零无数后来者扼腕叹息的态度,它做了至少两件如今为人诟病的事情。
1.不支持三维图形2.不支持双y轴坐标没错,ggplot里不支持三维图形,甚至图形的立体效果都没有,原因很简单如果支持三维,就违悖了它的绘图哲学,它认为对象(几何形状)可以按照图层一层一层叠加到坐标轴固定的画布上,这和photoshop比较相似,因此,ggplot绘制三维图形只能用等高线、渐变热点绘制,Hadley认为数据可视化展示的是规律而不是数据本身,绘制山头的高度变化时,没有必要绘制出整座山头,否则会影响受众的注意力。话虽如此,当ggplot绘制数学函数或物理场时就蔫了,但是话又说回来,对于一般的市场研究人员又有多少次会遇到这些情况?想想也就无需求全责备了,R从来不是一个包就一统天下的语言,R语言的处理方式就是不同的问题就找相应的包,包的功能和问题对应。
第二个不支持y轴双坐标争议更大,ok,我们还是请Hadley自己给大家解释一下:
1.如果使用双坐标,那么整个映射过程就不可逆了,也就是说,图中的点很难对应到数据空间(笔者注:原来一个坐标轴,图上的点很容易定位到数据集,如果使用两个轴,因为图上的点可能来自不同的数据集或同一个数据集不同标度的转换,这就是多对多的关系,无法逆转,只能通过其他维度在加以区分,比如颜色)。2.与其他变通方式相比,双轴增加了阅读难度,参见论文《A Study on Dual-Scale Data Charts》3.对于坐标轴的标度很难有标准,这样就容易引起误解,比如相同的温度,使用摄氏和华氏两个坐标轴就会显示出不同的意义,其实它们表示的温度是相同的,诸如此类的还有汇率。4.双轴的观点比较主观,有了两个轴为什么不能来3个、4个。。。。最后终于有一个网友把Hadley惹毛了,就愤怒的在stackflow上评论说,如果想要我在ggplot2里添加双坐标轴这个功能,不是不可以,需要支付8万美元的报酬。我还能说些什么呢,真是一个执拗的数据科学家,但是执拗的人坚持的不一定不是真理,只是不愿意迎合大众的口味。
看了Hadley的评论笔者这里还真要为他打抱不平,其实一个人坚持自己的态度和原则已经很难,何况是面对大多数的攻击仍然坚持非常正确的理念呢。下面我们就从几个方面说说双轴图的原罪,首先双轴图的意义无外乎两点:
首先比方说我们将两列数据绘制在单轴上,发现他们是接近平行线,这应该是他们本该具有的状态,但是如果两条线的单位不同,你觉得他们之间的差值还有比较意义么,比如日元和美元?另外如果我们在图上添加一个周会发生什么变化呢?右上图是面积图,你很容易发现他们之间的差值缩小了,所以如果是双轴不同标度的折现比较差异是不靠谱的(很多国外记者使用这样的招数(推荐阅读1,2);那么既然差值不靠谱,趋势比较总可以吧?
答案仍然让人很失望,趋势比较同样会误导受众得出错误的结论,同样是上图的数据,左上原数据在单轴同标度下是两条接近平行的折线,它们的增长率是一个样的,趋势是相同的,不难看出,如果绘制成不同标度的双轴图那么两条线就不是平行线了,斜率变了,趋势变了,一切都是人为操纵的结果了。综上所述,将两个标度不同的图合为一张图根本完不成任何对比效果,反而会误导受众得出错误的结论,这些恐怕就是出乎领导们意料之外的吧?绘制双坐标图唯一的好处就是节省了空间,但这种以误导受众为代价的节省空间,哪一个有态度有原则的数据分析师会接受呢?
下面就是纽约时报利用双轴误导读着的一个经典例子《An Old Formula That Points to New Worry》,文中给了一幅双轴坐标图,用来说明一个时间拟合模型和纳斯达克500股指的拟合趋势,我们放下这个模型的统计学漏洞暂且不提(很多),我们评价拟合时首先评价的是对趋势拟合的好不好,其实可以按照我们上述方式,调节其中一个轴来控制时间模型的拟合结果,想让它看起来很棒就调一下其中一个轴,改变下趋势斜率,想让它看起来很糟糕,也可以使用同样的办法。
文章还不无廉耻的说随着时间的推进模型拟合的结果和股指之间的差值更大了(即中间空白),是的,看过上面的分析你就知道,它们之间的空白根本没有意义,想留更多的空白,调节以一下轴标度就可以了,真是非常奇葩的思维。
不可否认,作为一个数据可视化设计的工作者,你可能会受到那些一无所知脑满肠肥的领导要求你将两个不同标度的图放在一起,方法是这样,你可以给他讲双轴图的缺点,如果他不听,就让他使用双轴去做决策吧。
可以关注我们的公众号,很多关于R和python的书籍、数据、文章、代码。
关于我们,关注理性与文艺,用数据创作内容性的精致阅读,这里是数据分析挖掘人员与文艺青年的集结地,不做鼓吹,只踏踏实实的做一个又一个数据驱动的文章,用数据解读生活现象,实实在在的数据挖掘、分析、可视化,并分享十分清晰的思路和代码注释,并设计机器人减轻数据分析的负担,无论你感兴趣还是想参与都可以关注,请加微信公众号大音如霜