更改y值的Matplotlib热图

2024-05-16 16:17:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图绘制一些数据,以便在两个表面之间进行测量。系统中的z方向定义为垂直于曲面。问题是沿着x轴我改变了两个表面之间的距离,这意味着对于每个切片,y轴的最小值/最大值都会改变。我提出了一个标准化的y轴,其中z_min是底面,z_max是顶面 enter image description here

然而,这种表示有点扭曲了数据。理想情况下,我想在y轴上显示到墙的实际距离,并将系统边界之外的区域保留为白色。我(很差)勾勒出了我在这里的设想(当然,热图上的实际分布应该看起来有所不同): enter image description here

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

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

我猜我必须炸掉MxN数组并通过插值填充缺失的值,或者简单地将它们标记为NAN?但是,我也不太确定如何在我的配色方案中添加硬截止线,使系统之外的一切都变成白色。


Tags: 数据距离定义系统绘制切片min方向
3条回答

你可以用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

我想,也许使用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)

enter image description here

下面是一个用三角网格轮廓法实现的,基于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

相关问题 更多 >