FacetGrid of contour plots with custom z-index information

59 Views Asked by At

Recently I attempted using seaborn to produce a contour plot. The only related function, kdeplot, seemingly only allows to visualize density of data, and it is not possible to provide custom z-index information.

Let me illustrate on a toy example: we have a function f with two independent variables x, y and a dependent variable z.

def f(x: float, y: float) -> float:
    return x * y

I would like to construct a contour plot on [0,1] \times [0,1].

Specifically in my case, I was trying to align multiple such plots in seaborn FacetGrid.

Let me know your experience in my case.

In pure matplotlib, the single contour plot can be implemented as follows.

import itertools
import matplotlib.pyplot as plt
import numpy as np

# construct grid
N = 1000  # granularity
grid = np.linspace(0, 1, N, dtype='float32')

# evaluate function
z = map(lambda i: f(*i), itertools.product(grid, grid))

# plot
plt.contourf(
    grid,
    grid,
    np.array(list(z)).reshape((N, N)),
    100,
)
plt.show()

It is possible to embed matplotlib plots in seaborn FacetGrid, but I needed various workarounds to get even the most basic customizations of the facet. Several features I dealth with: custom ticks, unified styling (palette), shared color map, placing color bar.

At the end, I re-did everything using subfigures in matplotlib only, dropping seaborn. I would have no problem, if kdeplot allowed specifying custom z-index information.

Conclusions

  • It is not possible to produce contour plot in seaborn with provided z-index information.
  • Working with matplotlib plots in seaborn FacetGrid is possible, but becomes very nasty.

I don't want this to sound like criticism of seaborn. I genuinely love the package, it squeezes so much of matplotlib and is so easy to use. I am just annoyed about the limitations I encountered in my case.

0

There are 0 best solutions below