r - ggplot 中的空等高线图

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

最佳答案

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% 确定。

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

关于r - ggplot 中的空等高线图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65873211/

相关文章:

r - 为什么我的图表没有显示在 RStudio 的 "Plots" Pane 中?

r - 在 R 中使用 ggmap 添加上下文(或任意) map 插图?

r - Mutate() 基于在另一列中找到的不同长度的字符串向量的新列

r - case_when & %in%

r - 如何使用 R 的 xlsx 包对齐 XLSX 文件的单元格?

r - dplyr - 一次重新编码几列

R Web 抓取网站的多个级别

R ggplot2 有交互选项吗?

r - 如何更改 ggplot2 R 中 stat_poly_eq 的字体大小

对于海量数据,用 geom_boxplot 替换 geom_rug