9

我想用 Plotly 为时间序列绘制一个 3D 线图,并在每条线下填充。我在这里有一个示例代码。

library(plotly)

dens <- with(diamonds, tapply(price, INDEX = cut, density))
data <- data.frame(
  x = unlist(lapply(dens, "[[", "x")),
  y = unlist(lapply(dens, "[[", "y")),
  cut = rep(names(dens), each = length(dens[[1]]$x)))

p <- plot_ly(data, x = ~cut, y = ~x, z = ~y, type = 'scatter3d', mode = 'lines', color = ~cut)
p

使用此代码,我可以生成此图

没有填充的 3d 线图

在此处输入图像描述

我已经尝试过surfaceaxis=0,1 或 2,但他们产生了错误的填充物。

3D-Plotly 填充错误

在此处输入图像描述

我想要的是填充 x 轴和线图之间的区域。

有一个带有其他值的示例 3D 图。

作为示例 3D-Plot 在曲线下填充另一个值

在此处输入图像描述

有人可以建议一种方法吗?先感谢您。

编辑:它必须用包“plotly”创建

4

2 回答 2

7

如果你对伪 3d 没问题,你可以做一个山脊线密度图。我相信也有一个情节版本。

免责声明:我是ggridges包的作者。

library(ggplot2)
library(ggridges)

ggplot(diamonds, aes(x = price, y = cut, fill = cut)) +
  geom_density_ridges(scale = 2, alpha = 0.7) +
  scale_fill_brewer(guide = guide_legend(reverse = TRUE)) +
  scale_y_discrete(expand = c(0.01, 0)) +
  theme_ridges(center = TRUE)

在此处输入图像描述

于 2017-12-16T20:31:47.837 回答
3

更新:

FWIW,这似乎是一个错误,plotly其中在曲线下填充时没有考虑点的顺序并且它不是 R 特定的。

在 GitHub 上查看这个问题:https ://github.com/plotly/plotly.py/issues/1206



您可以尝试使用latticeExtra::cloud. 当然,它不会像plotly.

rle_x <- rle(as.numeric(factor(data$cut)))$lengths

mcolor <- c("red","blue","green","purple", "yellow")    

data$mcolor<-rep(mcolor[seq_along(rle_x)],times = rle_x)
    
cloud(y~x+cut, data, panel.3d.cloud=panel.3dbars, 
      xbase=0.4, ybase=0.4, scales=list(arrows=FALSE, col=1), 
      par.settings = list(axis.line = list(col = "transparent")),
      col.facet = data$mcolor,
      col = data$mcolor)

在此处输入图像描述

于 2017-12-16T20:30:58.427 回答