Python/Matplotlib-具有双线性插值的等高线图

Python/Matplotlib-具有双线性插值的等高线图,python,matplotlib,interpolation,Python,Matplotlib,Interpolation,我想绘制一个二维数据图,其中的值是由双线性插值确定的。作为初始测试,我决定只使用wikipedia页面中的示例: 然而,一般来说,我需要它来处理任何一组数据,所以一个只适用于这种特殊情况的解决方案是没有用的。下面的数据中有一个稍微复杂一点的例子,注释为“另一个例子” 以下是我到目前为止所做的几次尝试,评论中提到了为什么它不起作用: import matplotlib import numpy as np import matplotlib.cm as cm import matplotlib.

我想绘制一个二维数据图,其中的值是由双线性插值确定的。作为初始测试,我决定只使用wikipedia页面中的示例:

然而,一般来说,我需要它来处理任何一组数据,所以一个只适用于这种特殊情况的解决方案是没有用的。下面的数据中有一个稍微复杂一点的例子,注释为“另一个例子”

以下是我到目前为止所做的几次尝试,评论中提到了为什么它不起作用:

import matplotlib
import numpy as np
import matplotlib.cm as cm
import matplotlib.pyplot as plt
from scipy.interpolate import griddata

# http://en.wikipedia.org/wiki/File:Bilininterp.png
xi = np.array([0.0, 1.0])
yi = np.array([0.0, 1.0])
zi = np.array([[0.0, 1.0], [1.0, 0.5]])

# Another example
#xi = np.array([0.0, 0.25, 1.0])
#yi = np.array([0.0, 0.75, 1.0])
#zi = np.array([[0.0, 0.5, 1.0], [0.5, 0.7, 0.5], [1.0, 1.0, 1.0]])

# I want 20 "levels" to be shown
contour_breaks = 20
ticks = np.linspace(zi.min(), zi.max(), contour_breaks, endpoint=True)

# Attempt #1 (contour does not use bilinear interpolation)
fig = plt.figure()
axes = fig.add_subplot(111, aspect='equal')
axes.contour(xi, yi, zi, ticks[1:-1], colors='k')
fill = axes.contourf(xi, yi, zi, ticks, cmap=cm.jet)
fig.colorbar(fill, ticks=ticks)

# Attempt 2 (colors are weird for imshow -- they don't seem to be jet.  I can't
#            make it use ticks to make constant color zones/levels.  The contour
#            lines are the same as before (no bilinear).  Also, you cannot input
#            xi and yi, so the data would have to be interpolated to a regular
#            grid - see the second set of example data above for an example
#            where the data isn't regularly spaced)
fig = plt.figure()
axes = fig.add_subplot(111, aspect='equal')
axes.contour(xi, yi, zi, ticks[1:-1], colors='k')
fill = axes.imshow(zi, interpolation='bilinear', cmap=cm.jet,
                   extent=(0.,1.,0.,1.))
fig.colorbar(fill, ticks=ticks)

# Attempt 3 (griddata doens't do bilinear interpolation)
fig = plt.figure()
axes = fig.add_subplot(111, aspect='equal')
xi1, yi1 = np.meshgrid(xi, yi)
xi1 = xi1.flatten()
yi1 = yi1.flatten()
zi1 = zi.flatten()
xi2 = np.linspace(0., 1., 100)
yi2 = np.linspace(0., 1., 100)
zi2 = griddata((xi1, yi1), zi1, (xi2[None,:], yi2[:,None]), method='linear')
axes.contour(xi2, yi2, zi2, ticks[1:-1], colors='k')
fill = axes.contourf(xi2, yi2, zi2, ticks, cmap=cm.jet)
fig.colorbar(fill, ticks=ticks)

# Show the plots
plt.show()

这个似乎有用

import matplotlib
import numpy as np
import matplotlib.cm as cm
import matplotlib.pyplot as plt
from scipy.interpolate import interp2d

# http://en.wikipedia.org/wiki/File:Bilininterp.png
xi = np.array([0.0, 1.0])
yi = np.array([0.0, 1.0])
zi = np.array([[0.0, 1.0], [1.0, 0.5]])

# Another example
xi = np.array([0.0, 0.25, 1.0])
yi = np.array([0.0, 0.75, 1.0])
zi = np.array([[0.0, 0.5, 1.0], [0.5, 0.7, 0.5], [1.0, 1.0, 1.0]])

# I want 20 "levels" to be shown
contour_breaks = 20
ticks = np.linspace(zi.min(), zi.max(), contour_breaks, endpoint=True)

# Attempt 4 (interp2d does to correct bilinear interpolation)
fig = plt.figure()
axes = fig.add_subplot(111, aspect='equal')
f = interp2d(xi, yi, zi, kind='linear')
xi2 = np.linspace(0., 1., 100)
yi2 = np.linspace(0., 1., 100)
zi2 = f(xi2, yi2)
axes.contour(xi2, yi2, zi2, ticks[1:-1], colors='k')
fill = axes.contourf(xi2, yi2, zi2, ticks, cmap=cm.jet)
fig.colorbar(fill, ticks=ticks)

# Show the plots
plt.show()

这个似乎有用

import matplotlib
import numpy as np
import matplotlib.cm as cm
import matplotlib.pyplot as plt
from scipy.interpolate import interp2d

# http://en.wikipedia.org/wiki/File:Bilininterp.png
xi = np.array([0.0, 1.0])
yi = np.array([0.0, 1.0])
zi = np.array([[0.0, 1.0], [1.0, 0.5]])

# Another example
xi = np.array([0.0, 0.25, 1.0])
yi = np.array([0.0, 0.75, 1.0])
zi = np.array([[0.0, 0.5, 1.0], [0.5, 0.7, 0.5], [1.0, 1.0, 1.0]])

# I want 20 "levels" to be shown
contour_breaks = 20
ticks = np.linspace(zi.min(), zi.max(), contour_breaks, endpoint=True)

# Attempt 4 (interp2d does to correct bilinear interpolation)
fig = plt.figure()
axes = fig.add_subplot(111, aspect='equal')
f = interp2d(xi, yi, zi, kind='linear')
xi2 = np.linspace(0., 1., 100)
yi2 = np.linspace(0., 1., 100)
zi2 = f(xi2, yi2)
axes.contour(xi2, yi2, zi2, ticks[1:-1], colors='k')
fill = axes.contourf(xi2, yi2, zi2, ticks, cmap=cm.jet)
fig.colorbar(fill, ticks=ticks)

# Show the plots
plt.show()

你的问题是什么?另外,我认为二维数据上的“线性”插值是双线性的。我最初认为二维数据上的线性插值也是双线性的。但双线性实际上不是线性的,因为它是两个线性函数相乘的结果。如果你看这些图,结果是不正确的(不,和维基百科上的链接图片一样,我已经确认是正确的)。我的问题是如何正确绘制这幅图。试试看你的问题是什么?另外,我认为二维数据上的“线性”插值是双线性的。我最初认为二维数据上的线性插值也是双线性的。但双线性实际上不是线性的,因为它是两个线性函数相乘的结果。如果你看这些图,结果是不正确的(不,和维基百科上的链接图片一样,我已经确认是正确的)。我的问题是如何正确绘制此图。请尝试
map\u坐标