2016-02-19 14 views
5

Ich verwende Python Matplotlib zum Zeichnen von Konturen. Hier ist ein Code, den ich unten als Grundlage habe. Wenn Sie dies ausführen, werden Sie sehen, dass die Beschriftungen fast vertikal sind. Ich möchte die Etiketten horizontal ausrichten, aber ich weiß nicht, wie ich das erreichen kann. Ich habe es mit ClabelText versucht, was die Dokumentation vorschlägt, verstehe aber nicht, wie das funktionieren soll. Ich würde mich freuen, wenn jemand eine Möglichkeit vorschlagen könnte, die Labels mit oder ohne CabelText zu orientieren.ändern Sie die Ausrichtung der Kontur clabel Textobjekte

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

Antwort

2

Sie können die Rotation der einzelnen Etiketten nach ihrer Erstellung festlegen. Das Label Text Objekte werden von clabel zurückgegeben, so dass Sie sie speichern und über sie iterieren können, indem Sie .set_rotation(0) verwenden, um sie horizontal auszurichten.

Ändern Sie die letzten Zeilen des Skripts zu:

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

Große, genau das, was ich brauchte. Das wirft die nächste Frage auf, wie kann ich die ursprünglichen Etiketten (5.250 usw.) loswerden? Ich kann label2 löschen, aber die anderen sind noch da – user3293938