厚缊

诹图——chord diagram

厚缊 / 2019-12-08


ggcor有点改不动了,周末放松缓缓,顺便找找灵感。在学习reactR包的空余跟着学写了个nivochord包,摸索了几年的htmlwidgets终于出图了,捂脸。这个包非常简单,基本照搬例子对着做的,很多东西和原理不熟悉。

if(!require(devtools))
  install.packages(devtools)
devtools::install_github("houyunhuang/nivochord")

基本用法

nivochord基本就一个函数nivochord(),第一个参数是类矩阵的数据,需要是行列数相等,且都是数值型,第二个参数keys是每个类的名称,若为NULL,赋值为第一个参数的行名或者列名。

library(nivochord)
nivochord(data.matrix(mtcars[1:8, 1:8]), LETTERS[1:8])

修改颜色

colors参数可以用来修改图形的调色板,若比较熟悉js,可以使用更复杂的方式。

library(RColorBrewer)
m <- matrix(runif(36), ncol = 6)
rownames(m) <- paste0("row", 1:6)
col <- brewer.pal(3, "Set2")
nivochord(m, colors = col)

修改ribbon

innerRadiusRatio用来控制内部(ribbon)所在区域的比较,默认是0.9(即90%),这里我们设置成0.8,圆环宽度就相应的变大了。

nivochord(m, colors = col, innerRadiusRatio = 0.8)

innerRadiusOffset用来控制ribbon和圆环之间的距离,默认是0。我们设置成0.05看看效果。

nivochord(m, colors = col, innerRadiusRatio = 0.8,
          innerRadiusOffset = 0.05)

padAngle参数比较好玩,可以在每个小的圆环之间增加空白(用比例表示,360度为1)。

nivochord(m, colors = col, innerRadiusRatio = 0.8,
          innerRadiusOffset = 0.05, padAngle = 0.05)

处理图形边距

nivochord提供了.margin()函数,类似于ggplot2margin()函数,四个参数分别是下、左上、右四个方位的空白,单位是像素(px)。

nivochord(m, colors = col, innerRadiusRatio = 0.8,
          innerRadiusOffset = 0.05, padAngle = 0.05,
          margin = .margin(90, 60, 10, 60))

处理标签

总共有四个参数:

  • enableLabel——逻辑值,TRUE(默认)显示标签,FALSE不显示。

  • label——有三种模式,“id”(默认)标记名字,“value”标记值,最后一种是js函数,我不是很懂。

  • labelOffset——标签和圆环之间的偏移量,单位是像素(px),负数向内偏移,正数向外偏移。

  • labelRotation——标签旋转角度,(-180,180)之间,默认是0。

  • itemTextColor——标签颜色。

nivochord(data.matrix(mtcars[1:11, ]), labelRotation = -90,
          legends = NULL)
nivochord(data.matrix(mtcars[1:11, ]), labelOffset = -12, legends = NULL)
nivochord(data.matrix(mtcars[1:11, ]), label = "value", 
          legends = NULL) # 比较丑

图例设置

nivochord包中有.legend()函数来处理图例。

args(.legends)
## function (anchor = "bottom", direction = "row", justify = FALSE, 
##     translateX = 0, translateY = 70, itemWidth = 80, itemHeight = 14, 
##     itemsSpacing = 2, itemTextColor = "#999", itemDirection = "left-to-right", 
##     symbolSize = 15, ...) 
## NULL
colors = c("red", "blue", "yellow")
nivochord(m, colors = colors, legends = .legends(anchor = "top",
                                                 translateY = -45))

蚂蚁字体的图例,看不清。

nivochord(m, colors = c("blue", "green"), margin = .margin(40, 80, 40, 40),
          legends = .legends(anchor = "left", 
                             direction = "column",
                             translateX = -70))
nivochord(m, colors = c("orange", "green"), margin = .margin(40, 80, 40, 40),
          legends = .legends(anchor = "left", 
                             direction = "column",
                             translateX = -70,
                             symbolSize = 22))