ggplot 中的空等高线图

SiD*_*SiD 2 r ggplot2

我正在尝试创建一个简单的等高线图。

下面附有示例代码。输出是一个带有标签和警告消息的空图 -

1: stat_contour(): Zero contours were generated 
2: In min(x) : no non-missing arguments to min; returning Inf
3: In max(x) : no non-missing arguments to max; returning -Inf
Run Code Online (Sandbox Code Playgroud)

有人可以帮我解决它吗?

library(tidyverse)

# x and y are generated from uniform random distribution
x <- runif(1000, min = -5, max = 5)
y <- runif(1000, min = -5, max = 5)
z <- x^2 + y^2

tbl <- tibble(x, y, z)

ggplot(data = tbl,
       aes(x = x,
           y = y,
           z = z)) + 
  geom_contour_filled(alpha = 0.8) + 
  scale_fill_viridis_d(drop = FALSE) + 
Run Code Online (Sandbox Code Playgroud)

use*_*330 5

geom_contour和 的文档相当具有误导性:它表明,当和形成网格时,geom_contour_filled效果最好,但事实上,除非形成网格,否则根本不起作用。xy

要从随机(x,y,z)三元组创建网格,您可以使用该akima::interp函数。例如,从您的数据开始:

library(tidyverse)

# x and y are generated from uniform random distribution
x <- runif(1000, min = -5, max = 5)
y <- runif(1000, min = -5, max = 5)
z <- x^2 + y^2

tbl <- tibble(x, y, z)

grid <- akima::interp(tbl$x, tbl$y, tbl$z)
griddf <- data.frame(x = rep(grid$x, ncol(grid$z)), 
                     y = rep(grid$y, each = nrow(grid$z)), 
                     z = as.numeric(grid$z))
ggplot(data = griddf,
       aes(x = x,
           y = y,
           z = z)) + 
  geom_contour_filled(alpha = 0.8) + 
  scale_fill_viridis_d(drop = FALSE)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

请注意: akima不是 的一部分tidyverse,因此您需要手动将结果转换为 tibble/dataframe,并且很容易出错。我想我是对的,但由于你的函数是对称的,所以我不能 100% 确定。

刚刚注意到这里重塑的另一个解决方案: /sf/answers/1602663331/。你可能比我更喜欢那个(或者不喜欢,这是一个品味问题)。