簡體   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