2016-02-19 34 views
5

Używam Pythona Matplotlib do wykreślania konturów. Oto kod, który mam poniżej jako podstawę. Jeśli to uruchomisz, zobaczysz, że etykiety są prawie pionowe. Chciałbym, aby etykiety były ustawione poziomo, ale nie mam pojęcia, jak to osiągnąć. Próbowałem z ClabelText, co sugeruje dokumentacja, ale nie rozumiem, jak to ma działać. Byłbym wdzięczny, gdyby ktoś mógł zaproponować sposób zorientowania etykiet, z lub bez ClabelText.zmiana orientacji obiektów tekstowych z klauzulą ​​konturów

import itertools as it 
import numpy as np 
from matplotlib.ticker import FuncFormatter 
from matplotlib.contour import ClabelText 
import matplotlib.pyplot as plt 
from math import pi, log 

def getTime(data): 
    M = data['weight'] 
    Tei = data['temp'] 
    Twasser = 99.8 
    Teikl = 86.0 ## max allowed temp 
    k = 0.262 ## estimate was 0.3 W/(m.K), 
    Crho = 3.18 # (KJ/kgC) 
    const = pow(Crho, 1.0/3)/(pi*pi*k*pow(4*pi/3,2.0/3)) 
    Tval = const*pow(M,2.0/3)*log(0.76*(Tei-Twasser)/(Teikl-Twasser)) 
    return Tval # coo time in minutes 

def contourFmt(val, posn): 
    mins = int(val // 1) 
    secs = int(val % 1 *60) 
    return '{0:d}mm{1:d}ss'.format(mins, secs) 

def labeler(val): #is this any use?? 
    print(val) 
    return 

#weights = np.array(range(40, 80, 5))*1.0 
#temps = np.array(range(0, 30, 5))*1.0 
weights = np.arange(40.0, 80.0, 5.0) 
temps = np.arange(0.0, 25.01, 5.0) 

X = temps 
Y = weights 
Z = np.zeros((len(X), len(Y))) 
xx = [{'temp':i} for i in X] 
yy = [{'weight':i} for i in Y] 
plt.figure() 

##zz = it.product(xx,yy) 

for i, xdicts in enumerate(xx): 
    for j, ydicts in enumerate(yy): 
     zd = {} 
     zd.update(xdicts) 
     zd.update(ydicts) 
     zval = getTime(zd) 
     Z[i,j] = zval 

times = np.arange(4.00, 6.50, 0.25) 
CS = plt.contour(Y, X, Z, levels=times, colors='b') 

lbl = ClabelText(labeler) 
lbl.set_rotation('horizontal') 
formatter = FuncFormatter(contourFmt) 
#plt.clabel(CS, inline=True, fmt=formatter, fontsize=12) 
plt.clabel(CS, inline=True, use_clabeltext=True, fmt=formatter, fontsize=12) 

plt.grid(True) 
plt.clabel(CS, inline=1, fontsize=12) 
plt.show() 

Odpowiedz

2

Można ustawić obrót poszczególnych etykiet po ich utworzeniu. Obiekty etykiety są zwracane przez clabel, więc można je przechowywać i sprawdzać nad nimi, używając .set_rotation(0), aby orientować je poziomo.

Zmień ostatnie kilka linii skryptu do: dokładnie to, co potrzebne

labels1 = plt.clabel(CS, inline=True, use_clabeltext=True, fmt=formatter, fontsize=12) 
labels2 = plt.clabel(CS, inline=1, fontsize=12) 

for l in labels1+labels2: 
    l.set_rotation(0) 

enter image description here

+0

wielki,. To skłania do następnego pytania: jak mogę pozbyć się oryginalnych etykiet (5 250 i tak dalej)? Mogę usunąć label2, ale pozostałe wciąż tam są – user3293938