我正在尝试创建一个简单的等高线图。
示例代码附在下面。输出是一个带有标签和警告消息的空图 -
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) +
答案 0 :(得分:2)
geom_contour
和 geom_contour_filled
的文档非常具有误导性:它表明当 x
和 y
形成网格时效果最佳,但实际上,情况并非如此除非它们形成网格,否则根本无法工作。
要从随机 (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)
注意:akima
不是 tidyverse
的一部分,因此您需要手动将结果转换为 tibble/dataframe,而且很容易出错。我想我是对的,但由于您的函数是对称的,我不能 100% 确定。
刚刚注意到这里重塑的另一种解决方案:https://stackoverflow.com/a/22895190/2554330。你可能比我更喜欢那个(或者不,这是一个品味问题)。