【问题标题】:2D contour plot in python using 1D X, Y and Z variablespython中使用一维X、Y和Z变量的二维等高线图
【发布时间】: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() 数据并准备好创建轮廓,而无需执行meshgridinterpolate
  • 感谢@JohanC 的建议。 tricontour/tricontourf 似乎可以解决问题,但是,如果不进行外推,则轮廓不会填充完整的图,如上图所示。轮廓在 2d 框架中呈三角形向下突出。你能建议完整轮廓填充的插值吗?

标签: python numpy matplotlib contour


【解决方案1】:

感谢@JohanC 的回答。我想将他的建议与我的查询结合起来。

ax.contour 替换为 ax.tricontour 解决了我的情况。 ax.tricontourf 完成轮廓填充。因此,我的代码的最后一段将是:

fig, ax = plt.subplots(figsize=(6,2)) #x ranges between 3 to 57, y -1 to -10
ax.tricontour(X,Y,Z,limit) 
ax.tricontourf(X,Y,Z,limit) 
ax.set_title('Contour Plot')
plt.show()

【讨论】:

  • 如果问题已解决,您应该接受您的回答,这有助于过滤问题已解决:)
  • 感谢@Ruli 的推荐。我已经接受了。
【解决方案2】:

在丢失数据的情况下,我在处理不规则间隔的数据时遇到了类似的问题。有人提出的关于 2D 散点图的建议是完美的解决方案。

plt.figure(figsize=(10,10))
plt.scatter(df.doy,df[i].UT,c=df[i].TEC,s=10,cmap="jet")
plt.colorbar()

Likewsie,我使用plt.tricontourf 绘制了相同的等高线图并得到了相同的结果

plt.figure(figsize=(10,10))
plt.tricontourf(df.doy,df.UT,df.TEC,100,cmap="jet")
plt.colorbar()

【讨论】:

    猜你喜欢
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-17
    • 2021-09-25
    相关资源
    最近更新 更多