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