如何从 Python 中的 2D 散点图数据创建热图,其中散点图中的每个 (x,y) 点都有与其关联的 az 值?z 值将是用于为热图着色的值。
例如,在 R 中,我可以使用:
# 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))
Run Code Online (Sandbox Code Playgroud)
散点图(此散点图中的每个 (x,y) 点都有与之关联的 z 值;散点图中的 z 值不可见):
对应的热图(颜色代表z值):
请注意,此问题与Generate a heatmap in MatPlotLib using a scatter data set 不同,其中热图中的颜色表示 (x,y) 点的密度)。
我继续采纳 Gerges Dib 的建议。这是代码,从 3D 高斯分布采样 (x,y,z) 点:
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?](/sf/answers/2218090451/)
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()
Run Code Online (Sandbox Code Playgroud)
散点图.png:
tricontourf.png:
heatmap_interpolation_nearest.png
heatmap_interpolation_linear.png:
heatmap_interpolation_cubic.png:
| 归档时间: |
|
| 查看次数: |
2555 次 |
| 最近记录: |