在pcolormesh数据上绘制等高线

8

我有一些2D数据,正在使用pcolormesh显示,我希望在其上方显示几个等高线。我使用以下方法创建分格数据:

import numpy as np
import matplotlib.pyplot as plt

def bin(x, y, nbins, weights=None):
    hist, X, Y = np.histogram2d(x, y, bins=nbins, weights=weights)
    x_grid, y_grid = np.meshgrid(X,Y)
    return hist, x_grid, y_grid

data = ... # read from binary file
h,x_grid,y_grid = bin(data.x,data.y,512)
# do some calculations with h
h = masked_log(h) # "safe" log that replaces <0 elements by 0 in output

pcm = plt.pcolormesh(x_grid,y_grid,h,cmap='jet')

# Just pretend that the data are lying on the center of the grid
# points, rather than on the edges
cont = plt.contour(x_grid[0:-1,0:-1],y_grid[0:-1,0:-1],h,4,colors='k',origin='lower')

当我只绘制pcolormesh的输出时,一切看起来很好。但是添加等高线会使得画面变得非常混乱
我已经阅读了等高线演示、API 示例pcolormesh levels示例和这篇相关的SO文章(我的数据已经网格化,因此该解决方案没有帮助)。但迄今为止,我尝试的所有方法都没有在pcolormesh数据上创建出4个简单的等高线。

你的数据看起来很嘈杂,这可能是轮廓图不理想的原因。在使用轮廓图之前,你可以尝试对数据进行平滑处理。手动指定级别,例如 levels = np.linspace(-4, 6, 4) 用于 plt.contour(... , levels = levels) 可能也有所帮助......我建议上传你的数据以提供一个最小示例,这样人们才能提供帮助。 - Ed Smith
@EdSmith,我忘了提到我已经尝试过指定自己的轮廓级别,但没有成功。目前我的数据是专有的(也有4GB),无法上传。 - Tim
1个回答

10

我用高斯滤波器(和scipy库)编写了一个最小化的示例,我认为它看起来可能符合您的要求。首先,设置一些虚拟数据(高斯分布),并添加噪声。

import matplotlib
import numpy as np
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt

delta = 0.025
x = np.arange(-3.0, 3.0, delta)
y = np.arange(-2.0, 2.0, delta)
X, Y = np.meshgrid(x, y)
Z = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0)
Z += 0.1*np.random.random(Z.shape)

并尝试使用pcolormesh / contour,

plt.figure()
CS = plt.pcolormesh(X, Y, Z)
plt.contour(X, Y, Z, 4, colors='k')
plt.colorbar(CS)
plt.show()

看起来像这样:

在此输入图片描述

如果我们加入以下筛选:

import matplotlib
import numpy as np
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt
from scipy.ndimage.filters import gaussian_filter

delta = 0.025
x = np.arange(-3.0, 3.0, delta)
y = np.arange(-2.0, 2.0, delta)
X, Y = np.meshgrid(x, y)
Z = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0)
Z += 0.1*np.random.random(Z.shape)

plt.figure()
plt.pcolormesh(X, Y, Z)

CS = plt.contour(X, Y, gaussian_filter(Z, 5.), 4, colors='k',interpolation='none')
plt.colorbar()
plt.show()

看起来好多了,enter image description here


1
这正是问题所在!我一直以为自己做错了程序,但实际上只是数据有噪音。 - Tim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接