如何在 R 中创建曲面图

AW2*_*W27 2 r surface ggplot2 plotly ggplotly

我目前正在尝试开发一个曲面图来检查以下数据框的结果。我想在 x 轴上绘制噪声的增加值,在 y 轴上绘制 mu 的增加值,在 z 轴上绘制点估计值。查看 ggplot2 和 ggplotly 后,不清楚如何在表面或 3D 图中绘制这些列中的每一列。

 df <-  "mu noise0    noise1     noise2     noise3    noise4    noise5
    1      1  0.000000  0.9549526  0.8908646  0.919630  1.034607
    2      2  1.952901  1.9622004  2.0317115  1.919011  1.645479
    3      3  2.997467  0.5292921  2.8592976  3.034377  3.014647
    4      4  3.998339  4.0042379  3.9938346  4.013196  3.977212
    5      5  5.001337  4.9939060  4.9917115  4.997186  5.009082
    6      6  6.001987  5.9929932  5.9882173  6.015318  6.007156
    7      7  6.997924  6.9962483  7.0118066  6.182577  7.009172
    8      8  8.000022  7.9981131  8.0010066  8.005220  8.024569
    9      9  9.004437  9.0066182  8.9667536  8.978415  8.988935
   10     10 10.006595  9.9987245  9.9949733  9.993018 10.000646"
Run Code Online (Sandbox Code Playgroud)

提前致谢。

che*_*123 5

这是使用的一种方法geom_tile()。首先,您需要将数据框转换为更整洁的格式,其目标是包含列:

  • mu:这里没有任何变化
  • 噪音:需要将“噪音0”、“噪音1”……列组合在一起,并且
  • z:作为噪声值,我们将fill=使用此列应用美学。

为此,我使用dplyrgather(),但还有其他方法(melt(), 或pivot_longer()也可以实现)。我还添加了一些代码来仅提取“噪声”列的数字部分,然后将其重新格式化为整数,以确保 x 和 y 轴为数字/整数:

# assumes that df is your data as data.frame
df <- df %>% gather(key="noise", value="z", -mu)
    df <- df %>% separate(col = "noise", into=c('x', "noise"), sep=5) %>% select(-x)
    df$noise <- as.integer(df$noise)
Run Code Online (Sandbox Code Playgroud)

这是一个如何绘制它的示例但美观程度取决于您。我决定还包括geom_text()显示 的实际值,df$z以便我们可以更好地了解正在发生的情况。另外,我使用彩虹是因为“它很漂亮” - 您可能想从RColorBrewer包装中选择更合适的定量比较刻度。

ggplot(df, aes(x=noise, y=mu, fill=z)) + theme_bw() +
    geom_tile() +
    geom_text(aes(label=round(z, 2))) +
    scale_fill_gradientn(colors = rainbow(5))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

编辑:为了回答OP的后续行动,是的,你也可以通过展示这一点plotly。这是直接转换:

p <- plot_ly(
    df, x= ~noise, y= ~mu, z= ~z,
    type='mesh3d', intensity = ~z,
    colors= colorRamp(rainbow(5))
  )
p
Run Code Online (Sandbox Code Playgroud)

静态图在这里:

在此输入图像描述

显示这组特定信息的一种更丰富的方法是通过创建然后使用它来绘图来查看df$z它所涉及的变化。(您也可以通过上面的方式绘制):df$mudf$delta_zggplot() + geom_tile()

df$delta_z <- df$z - df$mu

p1 <- plot_ly(
    df, x= ~noise, y= ~mu, z= ~delta_z,
    type='mesh3d', intensity = ~delta_z,
    colors= colorRamp(rainbow(5))
  )
Run Code Online (Sandbox Code Playgroud)

给你这个(这里是静态图片):

在此输入图像描述