2016-02-19 16 views
5

Sto usando Python Matplotlib per tracciare i contorni. Ecco un codice che ho sotto come base. Se lo fai, vedrai che le etichette sono quasi verticali. Mi piacerebbe avere le etichette orientate orizzontalmente, ma non ho idea di come sia possibile ottenere questo risultato. Ho provato con ClabelText, che la documentazione suggerisce, ma non capisco come questo dovrebbe funzionare. Sarei grato se qualcuno potesse suggerire un modo per orientare le etichette, con o senza ClabelText.cambia l'orientamento degli oggetti di testo del contorno di riferimento

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

risposta

2

È possibile impostare la rotazione delle singole etichette dopo che sono state create. Gli oggetti Text etichetta sono restituiti da clabel, quindi è possibile memorizzarli e scorrere su di essi, utilizzando .set_rotation(0) per orientarli orizzontalmente.

Cambiare le ultime righe del suo script per:

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

Grande, esattamente quello che mi serviva. Ciò richiede la prossima domanda, come posso sbarazzarmi delle etichette originali (5.250 e così via)? Posso cancellare label2, ma gli altri sono ancora lì – user3293938

Problemi correlati