ggplot2 三维柱状图

22

我知道这听起来很基础,但我已经花了一个多小时的时间搜索了,但是没有成功。我只是想在'R'中使用'ggplot2'包绘制一个3D条形图。我的数据框看起来像这样:

 x   y     z
t1   5   high
t1   2   low
t1   4   med
t2   8   high
t2   1   low
t2   3   med
t3  50   high
t3  12   med
t3  35   low

我想在它上面绘制类似于这样的图表: 在此输入图像描述

非常感谢任何帮助!


16
你应该意识到,R爱好者认为Excel是一个丰富的反面教材,告诉我们如何 不要 做事情(正确地)。而三维条形图是传达准确量化信息的最不推荐的策略之一。 - IRTFM
@BondedDust 哈!是的,我意识到了。这可能就是为什么我找不到任何例子的原因。但我仍然想尝试,你提供的任何指针都会有所帮助...我只需要知道如何将第三个轴添加到我的 geom_bar() - Tavi
2
来自rgl的作者:https://stat.ethz.ch/pipermail/r-help/2007-September/141578.html和@hadley:http://vita.had.co.nz/papers/prodplots.pdf - IRTFM
7
我认为你不能使用 ggplot2 制作 3D 条形图。就像在我们的宇宙中超越光速一样,有些事情只是受到 Hadleyverse 基本法则的限制。无论如何,按颜色分组的线形图将更具信息量。例如,对于你上面列出的数据,请尝试使用以下代码(其中我已经命名了数据框为 dat):ggplot(dat, aes(x, y, group=z, colour=z)) + geom_line() + geom_point() - eipi10
2
需要使用ggplot吗?如果不是,请查看?latticeExtra::panel.3dbars中的示例。 - jbaums
显示剩余7条评论
2个回答

25

如评论中所述,当有其他选项可用时,3D图通常不是一个好选择,因为它们往往会给数据提供扭曲/模糊的视图。

话虽如此,以下是您可以使用 latticeExtra 绘制所需数据的方法:

d <- read.table(text=' x   y     z
t1   5   high
t1   2   low
t1   4   med
t2   8   high
t2   1   low
t2   3   med
t3  50   high
t3  12   med
t3  35   low', header=TRUE)

library(latticeExtra)

cloud(y~x+z, d, panel.3d.cloud=panel.3dbars, col.facet='grey', 
      xbase=0.4, ybase=0.4, scales=list(arrows=FALSE, col=1), 
      par.settings = list(axis.line = list(col = "transparent")))

在此输入图片描述


1
@maryam - 刚刚注意到 z 的级别排序不正确。在创建因子时,您可以通过明确指定级别顺序来进行更正。 - jbaums
哦,是的,它是中等 -> 低 -> 高,而不是高 -> 中等 -> 低。感谢更正 :) - Tavi
`y~x+z' 的意思是什么? - DavideChicco.it
@DavideChicco.it - 它指示要绘制y相对于xz(其中这些是数据d的元素)的图表。 - jbaums
@jbaums 谢谢,我应该先读文档。还有一个小问题:如何增加平行六面体的边长?谢谢! - DavideChicco.it
5
代码出现错误:使用数据包1时二元运算符的参数为非数值类型。 - Matthew Son

0

{rayshader}包是另一个允许进行3D可视化的包 - 根据作者所说,它只能对确实具有三个维度的数据进行3D可视化。这里基于瓷砖图

NB:下面需要我安装当前GitHub版本的rayshader(v.0.33.3)和rgl(v.1.0.0)包。

# devtools::install_github("tylermorganwall/rayshader") ## NB this will install a lot of dependencies
library(rayshader)
library(ggplot2)
d <- read.table(text=' x   y     z
t1   5   high
t1   2   low
t1   4   med
t2   8   high
t2   1   low
t2   3   med
t3  50   high
t3  12   med
t3  35   low', header=TRUE)

p <- ggplot(d, aes(x, z, fill = y)) +
  geom_tile() +
  scale_fill_fermenter(type = "div", palette = "RdYlBu")

plot_gg(p)
render_movie(filename = "plot.gif")

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接