R语言gg3D包绘制3D图形

本次分享一个绘图还不错的包——gg3D,2018年1月公布。

一、安装包

       gg3D包目前(写该文章时)在R语言官方网站还不能找到并下载,但可以通过开源的托管平台gitHub下载。

运行如下代码:

install.packages('devtools')
devtools::install_github("AckerDWM/gg3D")

       下载好gg3D包后,可以查看帮助发现只有5个函数分别为:axes_3D 绘制3D坐标轴,axis_labs_3D 标记坐标刻度,labs_3D标记坐标标签,stat_3D 绘制几何对象,stat_wireframe绘制3D线框或3D曲面。

       可以使用labs_3D添加轴标题。使用hjust,vjust和angle来实现良好的定位。

       可以使用axis_labs_3D添加轴标签。标签显示每个轴的最小值和最大值。同样,您可以使用hjust,vjust和angle来实现良好的定位。

二、投影绘制

       旋转3D投影,theta控制旋转,phi控制图的倾斜。先看一个“3种形态鸢尾花”数据集在3维空间的绘制。

# gg3D通常与 theme_void 以消除二维坐标系统
# 绘制鸢尾花数据集
library(gg3D)
library(ggplot2)
theta=10 #方位角的度数
phi=50 # 渐近线
ggplot(iris, aes(x=Petal.Width, y=Sepal.Width, z=Petal.Length, color=Species)) + 
  axes_3D(theta=theta, phi=phi) + stat_3D(theta=theta, phi=phi) +
  axis_labs_3D(theta=theta, phi=phi, size=3, hjust=c(1,1,1.2,1.2,1.2,1.2), vjust=c(-.5,-.5,-.2,-.2,1.2,1.2)) +
  labs_3D(theta=theta, phi=phi, hjust=c(1,0,0), vjust=c(1.5,1,-.2),labs=c("Petal width", "Sepal width", "Petal length")) +theme_void()

三、曲线绘制

      除了点之外,还可以使用stat_3D在3D中绘制其他geom。这些包括文本,行和路径。

      再看一个“饮食对鸡生长的影响”数据集的三维曲线绘制。

ggplot(ChickWeight, aes(x=as.numeric(Diet), y=as.numeric(Time), z=as.numeric(weight),color=Chick)) +
  theme_void() +
  axes_3D(theta=30, phi=20,colour='red') + stat_3D(theta=30, phi=20, geom="path") +
  theme(legend.position = "none",panel.background=element_rect(fill = 'black'))

四、曲面绘制

       可以使用stat_wireframe创建线框图。如果输入是熔融基质的形式,结果将是最好的。当然,线框可以分组并与其他绘图对象组合。

s = seq(-pi, pi, length= 100)
x <- expand.grid(s,s)$ Var1 # 100*100,expand.grid排列组合
y <- expand.grid(s,s)$ Var2
x1=c(x,x);y1=c(y,y);g=c(x,y)
z <- sin(x1)+cos(y1)
dt <- data.frame(x=x1,y=y1,z,g)
ggplot(dt, aes(x=x,y=y,z=z,group=g)) + theme_void() + axes_3D(theta=theta, phi=phi,colour='black') +
  stat_3D(theta=theta, phi=phi, geom="path",colour='557799') + theme(panel.background=element_rect(fill = 'black'))

五、注释修改

       目前gg3D贴图将所有轴缩小到范围(0,1)。当轴刻度变化很大时,这使得绘图很容易看到。但是,它使得任意定位的注释的添加不直观。仍然可以创建注释:指定具有不会被绘制的点的轴范围。

ggplot(ChickWeight, aes(x=as.numeric(Diet), y=as.numeric(Time), z=as.numeric(weight),
  color=Chick)) + theme_void() + axes_3D(theta=30, phi=20) +
  stat_3D(theta=30, phi=20, geom="path") + theme(legend.position = "none") +
  stat_3D(theta=30, phi=20,
          inherit.aes = F,
          data=data.frame(
            x=c(1:4,min(as.numeric(ChickWeight$Diet)), max(as.numeric(ChickWeight$Diet))),
            y=c(0,0,0,0,min(ChickWeight$Time), max(ChickWeight$Time)),
            z=c(0,0,0,0,min(ChickWeight$weight), max(ChickWeight$weight)),
            label=c(paste("Diet", 1:4), NA, NA)),
          aes(x=x, y=y, z=z, label=label),geom="text", vjust=1.2, hjust=1)

六、不足点

       当然,gg3D包也有它的不足:

       1、不能够自定义坐标刻度风格;颜色的透明度不能随意设置。

       2、只支持点对点数据格式,不支持公式化数据格式,不符合三维空间中常用的数学表示方法,这也会浪费很多时间在数据的设计上。

       3、目前该包只支持point,line,path三种几何类型,不支持pie,bar,hist对象。

七、拓展学习

      下面还有一个拓展学习。

df = volcano %>% 
  reshape2::melt() %>%
  mutate(col=interaction(Var1>mean(Var1), Var2>mean(Var2)))

g1 = ggplot(df, aes(Var1, Var2, z=value)) +
  axes_3D() +
  stat_wireframe(alpha=.5) +
  theme_void() +
  theme(legend.position = "none") +
  labs_3D(hjust=c(0,1,1), vjust=c(1, 1, -0.2), angle=c(0, 0, 90))

g2 = ggplot(df, aes(Var1, Var2, z=value, color=col)) +
  axes_3D() +
  stat_wireframe(alpha=.5) +
  theme_void() +
  theme(legend.position = "none") +
  labs_3D(hjust=c(0,1,1), vjust=c(1, 1, -0.2), angle=c(0, 0, 90))

g3 = ggplot(df, aes(Var1, Var2, z=value)) +
  axes_3D() +
  stat_wireframe(alpha=.5) +
  stat_3D(aes(color=value), alpha=.5) +
  theme_void() +
  theme(legend.position = "none") +
  scale_color_gradientn(colors=plot3D::jet2.col()) +
  labs_3D(hjust=c(0,1,1), vjust=c(1, 1, -0.2), angle=c(0, 0, 90))

plot_grid(g1, g2, g3, ncol=3)

 

文章未经博主同意,禁止转载!

 

  • 8
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值