在ggplot中绘制等高线

plot contours in ggplot

如何绘制等高线?

我有 x、y、z。我希望使用 V 值绘制等高线。

# data
tbl <- tibble(x = runif(n = 1000, min = 0, max = 1),
              y = runif(n = 1000, min = 0, max = 1),
              V = x^2.5 + y^2)

# plots
ggplot(data = tbl, 
       aes(x = x,
           y = y
           z = V)) + 
  geom_contour_filled(alpha = 0.8, breaks = seq(0, 2, 0.2)) +
  theme_bw()


geom_contour_filled 需要合并数据。

所以你的数据应该是

# data
tbl <- tibble(x = rep(seq(0,1,length.out=100),100),
              y = rep(seq(0,1,length.out=100),each=100),
              V = x^2.5 + y^2)

这是一种方法,通过无耻地复制和粘贴 geom_contour_filled 文档中的 franke 示例来解决问题。

诀窍是使用包 interp 来准备绘图数据。在下面的代码中,创建 grid 的指令中唯一的变化是数据集被合并。

suppressPackageStartupMessages({
  library(tidyverse)
  library(interp)
})

set.seed(2022)
tbl <- tibble(x = runif(n = 1000, min = 0, max = 1),
              y = runif(n = 1000, min = 0, max = 1),
              V = x^2.5 + y^2)
grid <- with(tbl, interp::interp(x, y, V))
griddf <- subset(data.frame(x = rep(grid$x, nrow(grid$z)),
                            y = rep(grid$y, each = ncol(grid$z)),
                            z = as.numeric(grid$z)),
                 !is.na(z))

# plots
ggplot(data = griddf,
       aes(x = x,
           y = y,
           z = z)) + 
  stat_contour_filled(alpha = 0.8, breaks = seq(0, 2, 0.2)) +
  theme_bw()

reprex package (v2.0.1)

于 2022-05-18 创建

编辑

为了更好地控制 bin,请使用参数 bins 或参数 binwidth 而不是 breaks。以下代码的 bin 宽度为 0.1,将 bin 的数量加倍,现在使用 geom_contour_filled,就像问题中一样。

ggplot(data = griddf,
       aes(x = x,
           y = y,
           z = z)) + 
  geom_contour_filled(alpha = 0.8, binwidth = 0.1, show.legend = FALSE) +
  theme_bw()

reprex package (v2.0.1)

于 2022-05-18 创建