查看原文
其他

ggplot2的3维画图时代

Y叔叔 biobabble 2020-02-05

还记得我写的《用ggplot2画3D》一文吗?里面讲述了画3D的奥秘,其实是一种视觉上的欺骗,首先需要定义一个函数去做2D到3D的坐标轴转换,然后就可以画图了。

这种思路现在已经有人去写包实现了,两个包threedggthreed,第一个包负责做坐标轴的转换,第二个包提供一些图层,方便我们直接ggplot出3维图,目前这个包只提供了geom_threedpie一个图层,可以期待以后出更多的图层,现在其实你还是得《用ggplot2画3D》一样的思路。

安装

devtools::install_github("coolbutuseless/threed")
devtools::install_github("coolbutuseless/ggthreed")

3维的饼图

library(ggplot2)
library(ggthreed)
ggplot(mtcars) + 
  geom_threedpie(aes(x = as.factor(cyl))) + 
  theme_void() + 
  theme(legend.position = 'bottom')

还记得我之前画的小兔子么?

和之前《用ggplot2画3D》思路一样,用threed包来做坐标轴转换,然后3D当2D来画。下面给出了茶壶的代码,可以看做是《没有金刚钻,揽不了瓷器活!》的3D版本。有兴趣的小伙伴还可以尝试画《3D版邪恶的曲线


library(threed)

camera_to_world <- look_at_matrix(eye = c(1.51.754), at = c(000))

obj <- threed::mesh3dobj$teapot %>%
  transform_by(invert_matrix(camera_to_world)) %>%
  perspective_projection() 

ggplot(obj, aes(x, y, group = zorder)) +
  geom_polygon(aes(fill = zorder, colour = zorder)) +
  theme_minimal() +
  theme(
    legend.position = 'none',
    axis.text       = element_blank()
  ) +
  coord_equal() +
  scale_fill_viridis_d (option = 'A') +
  scale_color_viridis_d(option = 'A')

往期精彩

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存