从 grid 到 ggplot 的跃迁

1引言

grid 绘图系统提供了很多基础的图形元素,能够绘制很多复杂的图形,但是弊端就是操作繁琐且复杂,基于 grid 系统升级封装的 ggplot2 则大大简化了图形绘制的繁琐,能让我们很快绘制出一些高级图形。前面我们在底层已经写好了一些环形的 grob,比如 point, segment, lines, rect 等等, 为了能够更方便的绘图, 我们可以吸取 ggplot2 的长处,做一些从 grob 到 geom 的转化,这是一个开始,下面拿一个arcPointGrob 作为初次尝试,当然会遇到很多困难和失败, 其中会涉及多方面的知识,但是不要怕, 下面我们尝试一下。

2arcPointGrob

我们先看看 arcPointGrob 能干什么,就是把直角坐标系的点转换为任意角度位置处的环形坐标,然后绘图。

先画个直角坐标系的散点图作为对照:

ggplot(mtcars) +
  geom_point(aes(mpg,disp))
图片

然后绘制环形的, 当然其中还涉及到了 arcSectorGrob, arcAxisGrob 两个图层:

newpage <- function(){
  grid.newpage()
  pushViewport(viewport(width = 0.9,height = 0.9,
                        xscale = c(-1,1),yscale = c(-1,1),
                        default.units = "snpc"))
  grid.circle(r = 0.5,gp = gpar(fill = "grey95",col = NA))
}

newpage()
grid.draw(arcSectorGrob(start = 0,end = 180,
                        r0 = 0.5,r1 = 1,
                        arcxAxisGrob.params = list(xscale = range(mtcars$mpg)),
                        arcyAxisGrob.params = list(yscale = range(mtcars$disp))))
grid.draw(arcPointGrob(x = mtcars$mpg,y = mtcars$disp,
                       start = 0,end = 180,
                        r0 = 0.5,r1 = 1))
图片

3转化为 geom 图层

为了更方便的想 ggplot 函数作为父类向下面各个图层传递一些相同的参数, 可以构建一个类似 ggplot的父类函数,这里就不过多介绍了,我们写一个 ggcirclize 的东西。然后就是构建相应的图层,这里叫geom_arcpoint, 因为涉及到整体坐标系的数值改变了 (x= c(-1,1),y = c(-1,1)), 还需要写一个 Stat 来对原始数据转换一下数值范围, 否则 默认绘制的坐标系坐标数值范围就和数据本身一样,这并不是我们想要的。下面来看看最终尝试的结果:

默认画个试试:

ggcirclize(data = mtcars,
           mapping = aes(x = mpg,y = disp)) +
  geom_arcpoint()
图片

映射一下变量试试:

ggcirclize(data = mtcars,
           mapping = aes(x = mpg,y = disp,
                         color = as.character(cyl),size = qsec)) +
  geom_arcpoint()
图片

调整背景:

ggcirclize(data = mtcars,mapping = aes(x = mpg,y = disp)) +
  geom_arcpoint(sector.bg.fill = "orange",
                sector.bg.lty = "dashed",
                sector.bg.lwd = 2)
图片

设置一下半径,角度,映射一下连续变量:

ggcirclize(data = mtcars,
           mapping = aes(x = mpg,y = disp,
                         color = qsec,size = qsec)) +
  geom_arcpoint(end = 270,r0 = 0.3,r1 = 0.8) +
  scale_color_gradient(low = "blue",high = "red")
图片

坐标轴设置:

ggcirclize(data = mtcars,
           mapping = aes(x = mpg,y = disp,
                         color = qsec,size = qsec)) +
  geom_arcpoint(end = 270,r0 = 0.6,r1 = 1,
                xAxis.params = list(pos = "bottom",
                                    breaks.n = 10,
                                    nice.facing = T)) +
  scale_color_gradient(low = "blue",high = "red")
图片

看来最终效果还是可以的,接下来就是完善其它相关图层了,工作量确实不小,此外还需要可以同时构建多个分类的 track 图层,类似于 ggplot 的分面的效果,不过我觉得先把这些基础图层搞好,后面按照变量分类把这些图层组合起来再画就行了。

这里总结一下思路: 从基础的 grid 构建自己的 grob 对象,然后转化为 geom 图层,再利用 ggplot 就可以写一下你自己的东西了。github 上面也有很多优秀的代码,可以好好学习一下。

4结尾

路漫漫其修远兮,吾将上下而求索。


欢迎加入生信交流群。加我微信我也拉你进 微信群聊 老俊俊生信交流群 (微信交流群需收取 20 元入群费用,一旦交费,拒不退还!(防止骗子和便于管理)) 。QQ 群可免费加入, 记得进群按格式修改备注哦。

声明:文中观点不代表本站立场。本文传送门:https://eyangzhen.com/373522.html

(0)
联系我们
联系我们
分享本页
返回顶部