本次分享一个绘图还不错的包——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)
文章未经博主同意,禁止转载!
|
请发表评论