2016-02-28 4 views
0

Я пытаюсь построить контурный график с пакетом Matplotlib от Python. Я пытаюсь получить аналогичные результаты с тем, что можно увидеть в this другом столбце переполнения стека. Тем не менее, у меня проблема с этим, говоря, что существует ошибка типа, и она сообщает мне TypeError: Invalid dimensions for image data, что видно из полного кода ошибки ниже.Построение контурного участка в Python с помощью Matplotlib с данными imshow

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() 

ответ

0

Я думаю, что проблема в том, что, что вам нужно иметь точки для интерполяции в сетчатом формате, а не две 1D матрицы для interpolate.griddata функции.

Добавление этой строки в (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") 
+0

Спасибо! Да, именно так! – Cmertin

 Смежные вопросы

  • Нет связанных вопросов^_^