2016-02-19 60 views
5

我正在使用Python Matplotlib繪製輪廓。以下是我以下的一些代碼作爲基礎。如果你運行這個,你會發現標籤幾乎是垂直的。我想讓標籤取向爲橫向​​,但我不知道如何實現這一點。我試過ClabelText,文檔建議,但不明白這應該如何工作。我很感激,如果有人可以提出一種方法來定位標籤,無論是否帶有ClabelText。更改輪廓標誌文本對象的方向

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

回答

2

您可以在創建單個標籤後設置單個標籤的旋轉。標籤Text對象返回clabel,因此您可以將它們存儲並迭代它們,使用.set_rotation(0)來水平定位它們。

更改腳本的最後幾行:

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

大,正是我需要的。這提示了下一個問題,我如何擺脫原始標籤(5,250等)?我可以刪除label2,但其他人仍然在那裏 – user3293938