3

How can one create a heatmap from a 2D scatterplot data in Python, where for each (x,y) point in the scatterplot one has a z value associated to it? The z value will be the value used to color the heatmap.


For example, in R, I can use :

# This example is from http://knowledge-forlife.com/r-creating-heatmap-scatterplot-data/ #I'm just setting the seed so you can see the same example on your computer set.seed(1) #Our X data x <- runif(150) #Our Y data y <- runif(150) #Our Z data z <- c(rnorm(mean=1,100),rnorm(mean=20,50)) #Store the length of our data N <- length(x) # View the scatterplot plot(x, y) #Here is the interpolation to give the heatmap effect. #Use xo and yo to set the output grid you want to use. #xo and yo are used to change the resolution of the interpolation #Here, I have included a somewhat standard protocol for these parameters s <- interp(x,y,z,xo=seq(min(x),max(x),length=N), yo=seq(min(x),max(x),length=N),duplicate="mean") #Here's where the fun happens #Note you can add your typical plotting paramaters here, such as xlab or ylab image.plot(s,xlim=c(0,1),ylim=c(0,1),zlim=c(-2,25)) 

Scatterplot (each (x,y) point in this scatterplot one has a z value associated to it; the z values aren't visible in the scatterplot):

enter image description here

Corresponding heatmap (the color represents the z values):

enter image description here

Note that this question is different from Generate a heatmap in MatPlotLib using a scatter data set, where the color in the heatmap represents the density of the (x,y) points).

2 Answers 2

5

I went ahead with Gerges Dib's suggestion. Here is the code, sampling (x,y,z) points from 3D Gaussian distribution:

import numpy as np import scipy.interpolate from scipy.stats import multivariate_normal import matplotlib.pyplot as plt import seaborn as sns sns.set() # Sample from 3D Gaussian distribution np.random.seed(0) number_of_samples = 20 x = np.random.rand(number_of_samples) y = np.random.rand(number_of_samples) xy = np.column_stack([x.flat, y.flat]) # Create a (N, 2) array of (x, y) pairs. mu = np.array([0.0, 0.0]) sigma = np.array([.95, 2.5]) covariance = np.diag(sigma**2) z = multivariate_normal.pdf(xy, mean=mu, cov=covariance) plt.scatter(x, y) plt.savefig('scatterplot.png', dpi=300) plt.tricontourf(x, y, z) plt.savefig('tricontourf.png', dpi=300) # Interpolate and generate heatmap: grid_x, grid_y = np.mgrid[x.min():x.max():1000j, y.min():y.max():1000j] for method in ['nearest','linear','cubic'] : plt.figure() grid_z = scipy.interpolate.griddata(xy,z,(grid_x, grid_y), method=method) # [pcolormesh with missing values?](https://stackoverflow.com/a/31687006/395857) import numpy.ma as ma plt.pcolormesh(grid_x, grid_y, ma.masked_invalid(grid_z), cmap='RdBu', vmin=np.nanmin(grid_z), vmax=np.nanmax(grid_z)) plt.title('{0} interpolation'.format(method)) plt.colorbar() plt.savefig('heatmap_interpolation_{0}.png'.format(method), dpi=300) plt.clf() plt.close() 

scatterplot.png:

enter image description here

tricontourf.png:

enter image description here

heatmap_interpolation_nearest.png

enter image description here

heatmap_interpolation_linear.png:

enter image description here

heatmap_interpolation_cubic.png:

enter image description here

Sign up to request clarification or add additional context in comments.

Comments

2

Here is a translation of your code into python using numpy for vector operations and matplotlib for plotting:

import numpy as np from matplotlib import pyplot x = np.random.uniform(size=150) y = np.random.uniform(size=150) z = np.concatenate([np.random.randn(100)+1, np.random.randn(50)+20]) pyplot.plot(x, y, 'ok') pyplot.tricontourf(x, y, z) pyplot.show() 

One difference here is that I did not use interpolation to put x and y on a grid, but rather used matplotlib's tricontourf which uses triangular tessellation. If you need to put the data onto a rectangular grid, you can use scipy.interpolate.griddata which works very similar to the interp function you have in R. Then, for plotting a regular grid, you can use pyplot.pcolormesh.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.