【问题标题】:How to plot a 3d surface plot using plotly in R?如何在 R 中使用 plotly 绘制 3d 曲面图?
【发布时间】:2021-05-02 15:28:01
【问题描述】:

我有以下数据集:

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) 处绘制一个 3d 图。我在这里读到 z 应该有维度 [x,y]。 3d Surface Plot in R with plotly 4 应该得到这样的东西:

我该如何绘制这个,因为不明白如何为 Z 创建具有此维度的矩阵?

【问题讨论】:

    标签: r plot plotly


    【解决方案1】:

    您的数据似乎不适合 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()
    

    【讨论】:

    • 谢谢!你也可以创建一个样本数据,它产生与我的图片中相同的轴相同的图(数字可以是随机的)? IE。如果我有 5 年的 X 变量(数字)的每小时数据(假设只有一组)。如何绘制 X=values, Y=years, Z=Months 的曲面图? (我应该按月和年分组并按平均值(值)汇总以绘制它吗?
    • 我会按月汇总。研究如何使用 lubridate 做到这一点。此示例数据切换月份和值,但基本上是您想要做的以及我将如何标记它。 library(plotly) library(tidyverse) dat = matrix(rnorm(24*60),ncol=24,nrow = 60) plot_ly(z = ~dat) %&gt;% add_surface() %&gt;% layout(scene = list(xaxis = list(title = "hours"), yaxis = list(title = "months"), zaxis = list(title = "value")))
    猜你喜欢
    • 1970-01-01
    • 2021-09-07
    • 1970-01-01
    • 2018-05-06
    • 2017-02-08
    • 1970-01-01
    • 2018-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多