【发布时间】:2020-12-05 10:34:47
【问题描述】:
首先让我承认我对 Python 很陌生。我想在 Python 中创建数据的等高线图,以便自动化该过程,否则可以使用 Surfer 轻松执行。我有 1000 多个这样的数据文件,手动创建可能非常乏味。 我正在使用的数据如下所示,它是一个数据帧,其中包含 0、1 和 2 标头以及 1,2,..279 作为索引:
0 1 2
0 3 -1 -0.010700
1 4 -1 0.040100
2 5 -1 0.061000
3 6 -1 0.052000
4 7 -1 0.013100
.. .. .. ...
275 30 -9 -1.530100
276 31 -9 -1.362300
277 32 -9 -1.190200
278 33 -9 -1.083600
279 30 -10 -1.864600
[280 rows x 3 columns]
这里,
x=data[0]
y=data[1]
z=data[2]
作为轮廓函数 pf matplotlib 要求 z 是一个二维数组;这就是混乱开始的地方。按照stackoverflow查询的几种解决方案,我做了以下事情:
import numpy as np
x=np.array(x)
y=np.array(y)
z=np.array(z)
X, Y = np.meshgrid(x, y)
import scipy.interpolate
rbf = scipy.interpolate.Rbf(x, y, z, function='cubic')
Z=rbf(X,Y)
lmin=data[2].min()
lmax=data[2].max()
progn=(lmax-lmin)/20
limit=np.arange(lmin,lmax,progn)
fig, ax = plt.subplots(figsize=(6,2)) #x ranges between 3 to 57, y -1 to -10
ax.contour(X,Y,Z,limit)
ax.set_title('Contour Plot')
plt.show()
使用上面的代码可以得出这个图。
然而,这是不希望的,如果一旦可以看穿表面噪声线,那么下面就有有序的等高线,这实际上是需要的,从这里的 surfer 生成的等高线图中可以看出。
我想重申,生成冲浪图时使用了相同的数据。
对创建所需情节的任何帮助将不胜感激。
【问题讨论】:
-
最简单的方法是使用
ax.tricontour(x, y, z, levels=np.linspace(lmin, lmax, 20))作为等值线。或tricontourf用于彩色区域。这些函数适用于 3 个不需要组织为 2D 网格的数组。请注意,X, Y = np.meshgrid(x, y)不适用于您的数据。 -
要查看数据点的分布情况,您可以对原始数据进行散点图
ax.scatter(x,y,z,s=0.1)。这些点可能已经组织得很好。您可能只需要reshape()数据并准备好创建轮廓,而无需执行meshgrid和interpolate。 -
感谢@JohanC 的建议。
tricontour/tricontourf似乎可以解决问题,但是,如果不进行外推,则轮廓不会填充完整的图,如上图所示。轮廓在 2d 框架中呈三角形向下突出。你能建议完整轮廓填充的插值吗?
标签: python numpy matplotlib contour