Home > front end >  plot contours in ggplot
plot contours in ggplot

Time:05-18

How do I plot contours ?

I have x, y, z. I wish to plot contour lines using V values.

# 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()


CodePudding user response:

Here is a way, solving the problem with a shameless copy&paste of the franke example in the documentation of geom_contour_filled.

The trick is to use package interp to prepare the data for plotting. In the code below the only change in the instruction to create grid is the data set being binned.

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

Created on 2022-05-18 by the reprex package (v2.0.1)


Edit

To better control the bins, use either argument bins or argument binwidth instead of breaks. The following code has a bin width of 0.1, doubling the number of bins and now uses geom_contour_filled, like in the question.

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

Created on 2022-05-18 by the reprex package (v2.0.1)

CodePudding user response:

geom_contour_filled require binned data.

So your data should be

# 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)
  • Related