我正在尝试创建一个简单的等高线图。
下面附有示例代码。输出是一个带有标签和警告消息的空图 -
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_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% 确定。
刚刚注意到此处 reshape 的另一个解决方案:https://stackoverflow.com/a/22895190/2554330 。您可能比我更喜欢那个(或不喜欢,这是一个品味问题)。
关于r - ggplot 中的空等高线图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65873211/