2015-12-18 4 views
1

У меня есть данные (link) вида приведены ниже:Как повернуть метки, чтобы следовать контурам в Python?

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) 
xm = np.tile(x, 21) 
xm = np.reshape(xm,(21, 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, 22, rstride=1, cstride=1, cmap=cm.gist_heat, 
          linewidth=0, antialiased=False, alpha = 1.0) 
    surf1 = plt.contour(y, xm, zm, 22, colors = '#000000', 
          linewidths=0.5, antialiased=False, alpha = 1.0) 
    plt.clabel(surf1, inline=1, fontsize=6) 
    plt.xlim([5, 10]) 
    p_tau.savefig(bbox_inches='tight') 
    plt.close() 

Я пытаюсь решить следующие вопросы:

1. В настоящее время все контурные наклейки вертикально. Как я могу повернуть метки , чтобы следовать контурам?

2. Как изменить положение меток так, чтобы они не перекрывались (как показано на рисунке)?

enter image description here

Дополнительный вопрос

3. Как обеспечить, чтобы этикетки всегда отображаются на участках, даже если ось пределы изменяются?

+0

Самый простой вариант может расположить этикетки вручную с помощью мыши. Вы можете сделать это, передав 'manual = True' в [' plt.clabel'] (http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.clabel). –

+1

Какую версию mpl вы используете? Метка должна вращаться по умолчанию, см. Http://matplotlib.org/examples/pylab_examples/contour_demo.html – tacaswell

+0

Версия 1.4.3. –

ответ

1

Я запустил код ниже в matplotlib 1.4.3 и получил повернутые этикетки контура, как вы хотели, поэтому я не знаю, почему у вас есть эта проблема. Для вашего второго вопроса, как насчет использования меньшего количества контуров?

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

x, y = np.pi*np.mgrid[-1:1:101j, -1:1:101j] 
z = np.sin(x)*np.sin(y) 

with PdfPages('./contour_plot.pdf') as p_tau: 
    _p_vs_tau_ = plt.figure(figsize=(5, 5)) 
    _p_vs_tau_.clf() 
    p_vs_tau = plt.subplot(111) 
    surf = plt.contourf(y, x, z, 21, rstride=1, cstride=1, cmap="RdYlBu", 
          linewidth=0, antialiased=False, alpha = 1.0) 
    surf1 = plt.contour(y, x, z, 21, colors='k', linestyles="solid", 
          linewidths=0.5, antialiased=False, alpha = 1.0) 
    plt.clabel(surf1, inline=1, fontsize=6) 
    plt.savefig("contour_plot.png", dpi=600) 
    p_tau.savefig(bbox_inches='tight')  
    plt.close() 

enter image description here

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