3

我正在尝试为从两个表面之间进行的测量绘制一些数据。系统中的 z 方向定义为垂直于表面。问题是,沿着我的绘图的 x 轴,我正在改变两个表面之间的间距,这意味着对于每个切片,y 轴的最小值/最大值都会发生变化。我通过呈现一个归一化的 y 轴来规避这个问题,其中 z_min 是底面,z_max 是顶面: 在此处输入图像描述

然而,这种表示在某种程度上扭曲了数据。理想情况下,我想在 y 轴上显示到墙壁的实际距离,并将系统边界之外的区域留白。我(糟糕地)勾勒了我在这里的设想(当然,热图上的实际分布应该看起来不同): 在此处输入图像描述

我可以很容易地绘制出我想要的 3D 散点图,如下所示: 在此处输入图像描述

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

我猜我将不得不炸毁 MxN 数组并通过插值填充缺失值,或者只是将它们标记为 NAN?但是我也不太确定如何在我的配色方案中添加硬截止以使系统之外的所有内容都变为白色。

4

3 回答 3

2

下面是基于 CT Zhu 示例的三角形网格轮廓的实现。

如果您的域不是凸的,则需要为三角剖分提供自己的三角形,因为默认的 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()

在此处输入图像描述

于 2013-11-01T17:43:34.313 回答
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)

在此处输入图像描述

于 2013-10-24T18:56:38.980 回答
1

我想,也许使用 2d 插值griddata将是你想要的?

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)

在此处输入图像描述

于 2013-10-25T02:59:10.637 回答