如何在R中使用plotly绘制3D表面图?

3

我有以下数据集:

group<-c(rep("X1",5),rep("X3",5))
set.seed(1)
value<-c(seq(0.2, 1, .2),seq(10, 30, 5))
time<-c("2018-07-01 00:00:00","2018-07-01 01:00:00","2018-07-01 02:00:00","2018-07-01 03:00:00","2018-07-01 04:00:00",
        "2018-07-01 00:00:00","2018-07-01 01:00:00","2018-07-01 03:00:00","2018-07-01 04:00:00","2018-07-01 05:00:00")
order<-c(1,2,3,4,5,1,2,4,5,6)
country<-c("HU","ZA","XX","ZZ","RO","HU","ZA","XX","ZZ","RO")
dat <-data.frame(time,country,group,value,order)

我想绘制一个三维图,其中x=order, Y=value, z=hour(time)。在这里我读到z应该具有[x,y]的维度。

使用Plotly在R中绘制三维曲面图

应该得到类似于下图的效果:

enter image description here

我应该如何绘制它?因为不理解如何创建具有此维度的Z矩阵?

1个回答

2

您的数据似乎不适用于3D。您不能在相同的x轴和y轴上具有两个z值。如果您过滤掉其中一个组,您可以在技术上使其工作,但我认为其他一些图表可能会更好。以下是如何使用一个组使其工作的示例,以及可能更适合的绘图示例。

library(plotly)

group<-c(rep("X1",5),rep("X3",5))
set.seed(1)
value<-c(seq(0.2, 1, .2),seq(10, 30, 5))
time<-c("2018-07-01 00:00:00","2018-07-01 01:00:00","2018-07-01 02:00:00","2018-07-01 03:00:00","2018-07-01 04:00:00",
        "2018-07-01 00:00:00","2018-07-01 01:00:00","2018-07-01 03:00:00","2018-07-01 04:00:00","2018-07-01 05:00:00")
order<-c(1,2,3,4,5,1,2,4,5,6)
country<-c("HU","ZA","XX","ZZ","RO","HU","ZA","XX","ZZ","RO")
dat <-data.frame(time,country,group,value,order)

library(tidyverse)
m = dat %>%
  filter(group == "X1") %>% 
  pivot_wider(c(time,value,order), names_from = time,
                    values_from = value) %>% 
  select(-order) %>%
  as.matrix
m[] = case_when(is.na(m) ~ 0, TRUE ~ m)
plot_ly(z = ~m) %>% 
  add_surface()

plot_ly(data = dat, x = ~time, y = ~value, color = ~group)

这是一个更适合的数据示例

m = matrix(rnorm(25),nrow = 5, ncol = 5)

plot_ly(z = ~m) %>% 
  add_surface()

谢谢!您能否创建一个示例数据,生成与我的图片相同的图形和轴(数字可以是随机的)?例如,如果我有5年的X变量(数字)的每小时数据(假设只有一组),我该如何绘制这个表面图,其中X=值,Y=年份,Z=月份?(我应该按月份和年份分组,并通过mean(values)聚合以便绘制它吗?) - Erko Tru
我会按月份汇总。看一下如何使用lubridate来做这件事。这个示例数据会切换月份和值,但基本上就是你想要做的,并且我会给它打标签。 ```library(plotly) library(tidyverse)dat = matrix(rnorm(24*60),ncol=24,nrow = 60) plot_ly(z = ~dat) %>% add_surface() %>% layout(scene = list(xaxis = list(title = "hours"), yaxis = list(title = "months"), zaxis = list(title = "value")))``` - bischrob

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