使用Matplotlib在Python中绘制等高线图,使用imshow绘制数据

时间:2016-02-28 23:47:24

标签: python matplotlib plot contour

我试图用Python的Matplotlib包绘制等高线图。我试图得到类似于this其他堆栈溢出帖子中可以看到的结果。但是,我遇到的问题是它有一个类型错误,它告诉我TypeError: Invalid dimensions for image data,这可以在下面的完整错误代码中看到。

Traceback (most recent call last):
    File "./plot_3.py", line 68, in <module>
        plt.imshow(zi, vmin=temp.min(), vmax=temp.max(), origin="lower", extent=[x.min(), x.max(), y.min(), y.max()])
    File "/usr/lib64/python2.7/site-packages/matplotlib/pyplot.py", line 3022, in imshow
**kwargs)
    File "/usr/lib64/python2.7/site-packages/matplotlib/__init__.py", line 1812, in inner
        return func(ax, *args, **kwargs)
    File "/usr/lib64/python2.7/site-packages/matplotlib/axes/_axes.py", line 4947, in imshow
        im.set_data(X)
    File "/usr/lib64/python2.7/site-packages/matplotlib/image.py", line 453, in set_data
        raise TypeError("Invalid dimensions for image data")
TypeError: Invalid dimensions for image data

我不确定这意味着什么,因为谷歌搜索没有提出如何修复它的有用结果。下面列出了代码,可以找到我正在使用的数据here。下面的代码只运行将解析文件的代码,然后将数据返回到所谓的主要位置,然后将其绘制出来。要运行代码,您必须使用./plot_3.py 20.0将其与我在上面发布的特定文件一起使用。 x的范围从0到0.3,有61个网格,而y的范围是0到0.4,有81个网格。数据格式为x,y,temperature,我希望temperature值为轮廓值。如果有人知道如何解决这个问题,我将非常感激。先谢谢!

from __future__ import print_function, division
import math
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
import sys
import matplotlib.cm as cm
from matplotlib.mlab import griddata
import scipy.interpolate

def ParseFile(filename):
    x = []
    y = []
    temp = []
    infile = open(filename, 'r')

    lines = [line.strip() for line in infile.readlines()]

    for line in lines:
        x.append(float(line.split(',')[0]))
        y.append(float(line.split(',')[1]))
        temp.append(float(line.split(',')[2]))

    return np.array(x), np.array(y), np.array(temp)

time = str(sys.argv[1])
filename = time + "_sec.dat"

x,y,temp = ParseFile(filename)
xi = np.linspace(min(x), max(x))
yi = np.linspace(min(y), max(y))
zi = scipy.interpolate.griddata((x,y),temp,(xi,yi),method="linear")

matplotlib.rcParams['xtick.direction'] = 'out'
matplotlib.rcParams['ytick.direction'] = 'out'
plt.imshow(zi, vmin=temp.min(), vmax=temp.max(), origin="lower", 
           extent=[x.min(), x.max(), y.min(), y.max()])
plt.colorbar()
plt.show()

1 个答案:

答案 0 :(得分:0)

我认为问题在于你需要以网格格式插值点,而不是插值格式函数的两个1D矩阵。

将此行添加到(xi,yi)声明中我认为可以解决您的问题:

x,y,temp = ParseFile(filename)
xi = np.linspace(min(x), max(x))
yi = np.linspace(min(y), max(y))
#create the 2D grid for interpolation:
xi, yi = np.meshgrid(xi,yi)
zi = scipy.interpolate.griddata((x,y),temp,(xi,yi),method="linear")