R语言gg3D包绘制3D图形

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

1、安装包

       gg3D包目前(写该文章时)在R语言官方网站还不能找到并下载,但能够经过开源的托管平台gitHub下载。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来实现良好的定位。spa

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

2、投影绘制

       旋转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()blog

3、曲线绘制

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

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

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'))

4、曲面绘制

       可使用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'))

5、注释修改

       目前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)

6、不足点

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

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

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

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

7、拓展学习

      下面还有一个拓展学习。

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)

 

文章未经博主赞成,禁止转载!