拼图很容易,像上面这张图,就是三张图拼在一起,但你仔细看一下,这结果可能不是你想要的,如果我们想要坐标轴按照值的大小对齐呢?
首先来一段产生上面图片的代码:
我确实是加了的,但就是不对齐!要对齐真的不容易,因为有两个因素在影响:
坐标轴的取值范围
画布的扩充区域
这两个因素必须要一致才好对齐。要搞也挺容易,标尺可以设定limits和expand两个参数,一次解决。要是使用或就只能解决第一部分。虽然有标记可以解决,但依然不容易啊。比如说的x轴取值是[4,8],我们设一下看看:
4和8的柱子都不见了,为何?因为会去过滤数据啊,柱子是用矩形画的,这矩形有四个点,比如以4为中心的这个矩形,4个点有两个小于4,两个大于4,那小于4的被干掉了,矩形就画不出来了。然后我们试试用标尺,给它扩充一些区域:
一方面确实如我们所想,x轴从[4,8]扩充到了[3,9],但柱子还是不见了,因为先干事,干完再扩充,该没的还是没有了。
这告诉我们一个什么事情?我们不能简单地从这些输入的数据集中计算range,取个并集了事,这是第二点,做完第二点得搞一下第一点,才能统一。然后还有第三点,如果连续型的数值,第一点容易搞,把limit range变大一点,但如果是字符型的,想想都觉得好难!然后还有第四点,你的输入可能不是一个data.frame,比如的输入是一个树对象,还有各种封装的函数,你的输入可能进行了各种操作之后,才来画图,然后就算你拿到了最终画图的data.frame,你还得拿到映射关系,到底什么变量映射到坐标轴上,在这基础上,才能谈什么1,2,3点。
得先扩limits,再去卡limits!
要在几个图中统一limits,并不简单。
如果是字符型的变量,怎么搞?
如果你根本不知道变量是啥!!!
总而言之,言而总之,这简单的问题一点都不简单!最主要是我现在造了一个轮子,于是我就给你谈各种你没有这个轮子很困难的场景,就像有了一个药之后,就大谈你好多病,得吃下这颗大力金刚丸一样。
我的解决方案就是在包中实现了和两个函数,像下面这种,它干的事情就是把的x轴值域设为和一样。如果是翻转过坐标轴的,会去设置它的轴。
现在我们再看,对齐了!如果这些子图的数据都是不全的,我们并不是以一个图来设置值域,而是以它们值域的并集来做,这时候,你可以传入参数,这种情况,基本上就相当于你在用和。
和最主要的一点,就是让你用一个图做为参照,方便你让其它图和它对齐。下面通过的例子来讲一下。和进化树拼图,在《用散点可视化一个矩阵》一文是有讲过的,不过那个例子,值域是一样的,假设像上面的例子中有缺失值,还得吃现在造的药丸。下面的例子中,的信息就不全,而且有对不上号的row。
我们可以使用包实现的动词来操作对象,然后就可以把相应的值给加上,用来画图。
画一个柱状图,画热图:
如果我们正常拼,就会像开篇的图一样,是对不上的,这时候我们就拿出,让其它图都和进化树对齐,然后再拼,完美!在拼图的时候,有参照的情况下,和就是这么方便:
你可以把开头的例子改一下,把改成或者试试,和一样是OK的。可以应对前面谈到的1,2,3,4四个点。
领取专属 10元无门槛券
私享最新 技术干货