Matplotlib 将pcolormesh和contour放在同一网格上?

Matplotlib 将pcolormesh和contour放在同一网格上?,matplotlib,Matplotlib,我正在尝试使用轮廓和pcolormesh显示带有轴标签的二维数据。如matplotlib用户列表中所述,这些函数遵循不同的约定:pcolormesh期望x和y值指定各个像素的角点,而contour期望像素的中心 使这些行为一致的最佳方法是什么 我考虑过的一个选项是创建“中心到边缘”函数,假设数据间隔均匀: def centers_to_edges(arr): dx = arr[1]-arr[0] newarr = np.linspace(arr.min()-dx/2,arr.ma

我正在尝试使用
轮廓
pcolormesh
显示带有轴标签的二维数据。如matplotlib用户列表中所述,这些函数遵循不同的约定:
pcolormesh
期望x和y值指定各个像素的角点,而
contour
期望像素的中心

使这些行为一致的最佳方法是什么

我考虑过的一个选项是创建“中心到边缘”函数,假设数据间隔均匀:

def centers_to_edges(arr):
    dx = arr[1]-arr[0]
    newarr = np.linspace(arr.min()-dx/2,arr.max()+dx/2,arr.size+1)
    return newarr
另一个选项是将
imshow
extent
关键字集一起使用。

第一种方法不能很好地处理二维轴(例如,由
网格网格
索引
创建),第二种方法完全丢弃轴号

您的数据是常规网格吗?如果没有,您可以使用griddata()获取它。我认为,如果你的数据太大,亚采样或正则化总是可能的。如果数据太大,可能您的输出图像与它相比总是很小,您可以利用这一点。 如果将imshow()与“extent”和“interpolation='nearest'”一起使用,您将看到数据以单元格为中心,而extent是由单元格的下边缘(角)提供的。另一方面,contour假设数据以单元为中心,并且X,Y必须是单元的中心。因此,您需要关心轮廓的输入域。一个简单的例子是:

x = np.arange(-10,10,1)
X,Y = np.meshgrid(x,x)
P = X**2+Y**2
imshow(P,extent=[-10,10,-10,10],interpolation='nearest',origin='lower')
contour(X+0.5,Y+0.5,P,20,colors='k')

我的测试告诉我pcolormesh()是一个非常慢的例程,我总是尽量避免它。griddata和imshow()对我来说总是一个不错的选择。

您是否考虑过使用
numpy.griddata
将所有数据插值到角点?(或中心)是的,但这会增加不必要的开销,而且在某些情况下,我会处理大数据(尽管我认为在我关心亚像素角点精度的情况下,可能不会……hrm)。另外,我想你指的是
scipy.interpolate.griddata
?我的意思是
scipy.interpolate.griddata
。如果因为数据太大而不想对其进行插值,请尝试将移位的x和y坐标数组传递给
ax.pcolormesh()
。这样你根本不需要接触你的数据。是的,这就是
中心到边缘的意图-我没有说清楚,所以我想这只是意味着我们在同一页上。