arcpolygon 画掰弯的图形

1引言

想象一下直角坐标系下的一些图形在以从(0,0)为圆形掰弯后长什么样?好像不太好想象。ggplot 图里面有个 geom_polygon 来根据一些 xy 坐标绘制包围起来的图形,grid 里面则是 grid.polygon 函数。要在极坐标下展示这些图形的样子,我们来写个 arcPolygonGrob 和 geom_arcpolygon


计算的思路是将每两点之间产生一些连续的点,以两点之间的角度(x 间距)和半径(y 间距),以圆心 c(0,0)产生的一系列连续点,然后计算出极坐标系的坐标。这样就将给每个位置都进行了极坐标转换,而不是简单的把图形整体进行了旋转而已而这并不是我们希望的结果

2arcPolygonGrob

画一个三角形:x <- c(0.1,0.5,0.9)
y <- c(0.1,0.9,0.1)

grid.newpage()
grid.polygon(x = x,y = y)

图片

掰弯后居然长这样:newpage()
grid.draw(arcPolygonGrob(x = x,y = y,
                         start = 0,end = 180,r0 = 0.5,r1 = 1))

图片

上面因为只有一个图形,所以看着样子变化较大,我们多画几个看看,这样看着比较像一点:x1 <- seq(0,23,1)
y1 <- rep(y,8)

newpage()
grid.draw(arcPolygonGrob(x = x1,y = y1,
                         id = rep(1:8,each = 3),
                         start = 0,end = 360,r0 = 0.5,r1 = 1))

图片

正常的矩形转换后就是常见的环形了:x <- c(0.1,0.1,0.9,0.9)
y <- c(0.1,0.9,0.9,0.1)

newpage()
grid.draw(arcPolygonGrob(x = x,y = y,
                         start = 0,end = 180,r0 = 0.5,r1 = 1))

图片

看一个正常的梯形:x <- c(0.1,0.3,0.1,0.9,0.7,0.9)
y <- c(0.1,0.5,0.9,0.9,0.5,0.1)

grid.newpage()
grid.polygon(x = x,y = y)

图片

掰弯以后长这样:newpage()
grid.draw(arcPolygonGrob(x = x,y = y,
                         start = 0,end = 180,r0 = 0.5,r1 = 1))

图片

画在一起,给 id 分类就行:newpage()
grid.draw(arcPolygonGrob(x = c(0.1,0.2,0.3,0.4,0.5,0.4,0.7,0.6,0.7),
                         y = c(0.1,0.9,0.1,0.1,0.5,0.9,0.9,0.5,0.1),
                         id = c(rep("a",3),rep("b",6)),
                         polygon.gp = gpar(fill = c("pink","orange")),
                         start = 0,end = 180,r0 = 0.5,r1 = 1))

图片

我们在看一个 ggplot 的示例:

ids <- factor(c("1.1", "2.1", "1.2", "2.2", "1.3", "2.3"))

values <- data.frame(
  id = ids,
  value = c(3, 3.1, 3.1, 3.2, 3.15, 3.5)
)

positions <- data.frame(
  id = rep(ids, each = 4),
  x = c(2, 1, 1.1, 2.2, 1, 0, 0.3, 1.1, 2.2, 1.1, 1.2, 2.5, 1.1, 0.3,
        0.5, 1.2, 2.5, 1.2, 1.3, 2.7, 1.2, 0.5, 0.6, 1.3),
  y = c(-0.5, 0, 1, 0.5, 0, 0.5, 1.5, 1, 0.5, 1, 2.1, 1.7, 1, 1.5,
        2.2, 2.1, 1.7, 2.1, 3.2, 2.8, 2.1, 2.2, 3.3, 3.2)
)

# Currently we need to manually merge the two together
datapoly <- merge(values, positions, by = c("id"))

p <- ggplot(datapoly, aes(x = x, y = y)) +
  geom_polygon(aes(fill = value, group = id))
p

图片

掰弯一下:newpage()
grid.draw(arcPolygonGrob(x = datapoly$x,y = datapoly$y,id = datapoly$id,
                         start = 0,end = 180,r0 = 0.5,r1 = 1,
                         polygon.gp = gpar(fill = 1:6)))

图片

有了这些基础,我们下面构建一个 geom_arcpolygon 图层。

3geom_arcpolygon

我们直接用上面的 ggplot 构建的示例数据来画:ggcirclize(datapoly, aes(x = x, y = y)) +
  geom_arcpolygon(aes(fill = value, group = id))

图片

画一下刚才那个三角形和梯形:df <- data.frame(x = c(0.1,0.2,0.3,0.4,0.5,0.4,0.7,0.6,0.7),
                 y = c(0.1,0.9,0.1,0.1,0.5,0.9,0.9,0.5,0.1),
                 id = c(rep(1,3),rep(2,6)))

ggcirclize(df, aes(x = x, y = y)) +
  geom_arcpolygon(aes(group = id))

图片

两个直三角形:d=data.frame(x=c(1,2,2, 3,4,4), y=c(1,1,2, 2,2,3),
             t=c('a', 'a', 'a',  'b', 'b', 'b'),
             r=c(1,2,3, 4,5,6))
ggplot() +
  geom_polygon(data=d, mapping=aes(x=x, y=y, group=t))

图片

掰弯长这样:ggcirclize(d, aes(x = x, y = y)) +
  geom_arcpolygon(aes(id = t))

图片

4图层拓展

基于 geom_arcpolygon 可以拓展到其它图层,下面看看例子

geom_arcribbon

huron <- data.frame(year = 1875:1972, level = as.vector(LakeHuron))
huron$g <- sample(letters[1:3],98,replace = T)

ggplot(huron, aes(year)) +
  geom_ribbon(aes(ymin = level - 1, ymax = level + 1), fill = "grey70") +
  geom_line(aes(y = level))

图片

ggcirclize(huron, aes(x = year)) +
  geom_arcribbon(aes(ymin = level - 1, ymax = level + 1), fill = "grey70")

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

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