Matplotlib热图与改变y值

时间:2013-10-24 17:16:50

标签: python matplotlib heatmap

我正在尝试绘制一些数据,用于从两个表面之间进行测量。系统中的z方向定义为垂直于曲面。问题是沿着我的图的x轴我改变两个表面之间的间隔距离,这意味着对于每个切片,y轴的最小值/最大值改变。我通过呈现归一化的y轴来排除这种情况,其中z_min是底部表面,z_max是顶部表面: enter image description here

然而,这种表示在某种程度上扭曲了数据。理想情况下,我想在y轴上显示与墙壁的实际距离,并将系统边界外的区域保持为白色。我(很差)描绘了我在这里想象的东西(当然,热图上的实际分布应该看起来不同): enter image description here

我可以很容易地绘制我想要的3D散点图,如下所示: enter image description here

但是如何将数据转换为热图的绘图形式?

我猜我必须炸掉MxN阵列并通过插值填充缺失值或者只是将它们标记为NAN?但是,我也不太确定如何在我的配色方案中增加一个硬截止点,以使系统外的所有内容都变白。

3 个答案:

答案 0 :(得分:2)

你可以用pcolormesh来做到这一点,它将四边形的角落作为争论

X, Y = np.meshgrid(np.linspace(0, 10, 100), np.linspace(0, 2*np.pi, 150),)
h = np.sin(Y)
Y *= np.linspace(.5, 1, 100)

fig, ax = plt.subplots(1, 1)
ax.pcolormesh(X, Y, h)

enter image description here

答案 1 :(得分:2)

下面是一个三角形网格轮廓的实现,基于CT朱的例子。

如果您的域不是凸面,则需要为三角剖分提供自己的三角形,因为默认的Delaunay三角剖分会从您的点中对凸包进行网格划分。

import matplotlib
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.tri as mtri


y = np.array([np.linspace(-i, i, 51) for i in (
              np.linspace(5, 10))[::-1]])
x = (np.zeros((50, 51)) +
     np.linspace(1, 6, 50)[..., np.newaxis])
z = (np.zeros((50, 51)) -
     np.linspace(-5, 5, 51)**2 + 10)  # make up some z data

x = x.flatten()
y = y.flatten()
z = z.flatten()

print "x shape: ", x.shape

triang = mtri.Triangulation(x, y)
plt.tricontourf(triang, z)
plt.colorbar()
plt.show()

enter image description here

答案 2 :(得分:1)

我想,使用griddata进行2d插值可能就是你想要的吗?

from matplotlib.mlab import griddata
xi=linspace(1,5,100)
yi=linspace(-10.5, 10.5, 100)
y=array([linspace(-i, i, 51) for i in (linspace(5,10))[::-1]]) #make up some y vectors with different range
x=zeros((50,51))+linspace(1,6, 50)[...,newaxis]
z=zeros((50,51))-linspace(-5, 5,51)**2+10 #make up some z data
x=x.flatten()
y=y.flatten()
z=z.flatten()
zi=griddata(x, y, z, xi, yi)
plt.contourf(xi, yi, zi, levels=-linspace(-5, 5,51)**2+10)

enter image description here