ggplot中的空等高线图

时间:2021-01-24 16:40:31

标签: 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

谁能帮我修一下。

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) + 

1 个答案:

答案 0 :(得分:2)

geom_contourgeom_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)

enter image description here

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

刚刚注意到这里重塑的另一种解决方案:https://stackoverflow.com/a/22895190/2554330。你可能比我更喜欢那个(或者不,这是一个品味问题)。

相关问题