繁体   English   中英

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

[英]Plotting a contour plot in Python with Matplotlib with data with imshow

我正在尝试使用Python的Matplotlib软件包绘制轮廓图。 我试图得到类似的结果是什么中可以看到这个其他堆栈溢出后。 但是,我遇到了一个问题,即存在类型错误,它告诉我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

我不确定这是什么意思,因为谷歌搜索在如何修复它方面没有产生有用的结果。 下面列出了代码,可以在此处找到我正在使用的数据。 下面的代码仅运行将解析文件的代码,然后将数据返回到应该绘制该数据的主要位置。 要运行代码,您必须使用./plot_3.py 20.0将其与我上面发布的特定文件一起使用。 x的范围从61的0到0.3,而y的范围从81的0到0.4。 数据的格式为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()

我认为问题在于,您需要以网格格式插入点,而不是interpolate.griddata函数的两个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")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM