2015-12-11 7 views
1

У меня есть данные (link) вида приведены ниже:Как правильно создавать контуры с помощью matplotlib?

Y X 0 X 10 X 20 
15 4.83 4.91 4.99 
20 4.58 4.65 4.73 
25 4.43 4.49 4.56 

Я пытаюсь построить контуры X метка ценности, в этих случаях 0, 10, 20 (как г в коде) с по оси X как значения X и оси y как значения Y. Участки создаются с использованием кода:

import numpy as np 
import re 
from matplotlib.backends.backend_pdf import PdfPages 
import matplotlib.pyplot as plt 
import matplotlib.cm as cm 

with open('contour.dat', "r") as data: 
    while True: 
     line = data.readline() 
     if not line.startswith('#'): 
      break 
    data_header = [i for i in line.strip().split('\t') if i] 
_data_ = np.genfromtxt('contour.dat', skiprows = 2, delimiter = '\t') 
x = _data_[:, 0] 
y = _data_[:, 1:] 


y_n = [] 
for i in range(len(data_header)): 
    if data_header[i][0] == 'X': 
     y_n = np.int_(np.append(y_n, i)) 
y_index = [data_header[i] for i in y_n] 
z = [] 
for i in range(0, len(data_header)): 
    z = np.append(z, re.findall(r"[-+]?\d*\.\d+|\d+", data_header[i])) 
z = z.reshape(len(z), 1) 
z = np.tile(z, (len(x), len(x))) 


with PdfPages('./on_tau.pdf') as p_tau: 
    _p_vs_tau_ = plt.figure(figsize=(5, 5)) 
    _p_vs_tau_.clf() 
    p_vs_tau = plt.subplot(111) 
    x, y = np.meshgrid(x, y) 
    surf = plt.contourf(y, x, z, 30, rstride=1, cstride=1, cmap=cm.gist_heat, 
          linewidth=0, antialiased=False, alpha = 1.0) 
    surf1 = plt.contour(y, x, z, 30, colors = '#000000', 
          linewidths=0.5, antialiased=False, alpha = 1.0) 
    plt.clabel(surf1, inline=1, fontsize=6) 
    p_tau.savefig(bbox_inches='tight') 
    plt.close() 

Но я не получаю правильные контуры. Я считаю, что я что-то делаю неправильно, возможно, повторяя значения z. Как правильно получить контуры?

ответ

0

Вызывает ли это контур, который вы ищете? Измененный код из вашего оператора z = np.tile (теперь закомментирован):

#z = np.tile(z, (len(x), len(x))) 
xm = np.tile(x,11) 
xm = np.reshape(xm,(11,10)).T 
zm = np.tile(z,10).T 

with PdfPages('./on_tau.pdf') as p_tau: 
    _p_vs_tau_ = plt.figure(figsize=(5, 5)) 
    _p_vs_tau_.clf() 
    p_vs_tau = plt.subplot(111) 
    #x, y = np.meshgrid(x, y) 
    surf = plt.contourf(y, xm, zm, 30, rstride=1, cstride=1, cmap=cm.gist_heat, 
         linewidth=0, antialiased=False, alpha = 1.0) 
    surf1 = plt.contour(y, xm, zm, 30, colors = '#000000', 
         linewidths=0.5, antialiased=False, alpha = 1.0) 
    plt.clabel(surf1, inline=1, fontsize=6) 
    p_tau.savefig(bbox_inches='tight') 
    plt.close() 
+0

Вы также знаете, как получить контур последнего значения? –

+0

Я думаю, что это связано с тем, что ваши данные находятся точно на границе. После оператора назначения zm добавьте: zm = zm.astype (float); zm [zm == 100.] + = 0,001. Затем он должен показать последнюю контурную линию. – screenpaver