2016-02-19 20 views
5

Tôi đang sử dụng Python Matplotlib để vẽ đường nét. Dưới đây là một số mã tôi có dưới đây làm cơ sở. Nếu bạn chạy điều này, bạn sẽ thấy rằng các nhãn gần như ở dọc. Tôi muốn có được các nhãn định hướng ngang, nhưng tôi không có ý tưởng làm thế nào có thể đạt được điều này. Tôi đã thử với ClabelText, mà các tài liệu cho thấy, nhưng không hiểu làm thế nào điều này là nghĩa vụ phải làm việc. Tôi đánh giá cao nếu ai đó có thể đề xuất một cách để định hướng các nhãn, có hoặc không có ClabelText.thay đổi hướng của đối tượng văn bản nhãn viền đường viền

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

Trả lời

2

Bạn có thể đặt xoay vòng các nhãn riêng lẻ sau khi chúng được tạo. Nhãn Text đối tượng được trả về bằng clabel, vì vậy bạn có thể lưu trữ chúng và lặp lại chúng, sử dụng .set_rotation(0) để định hướng chúng theo chiều ngang.

Thay đổi một vài dòng cuối cùng của kịch bản của bạn:

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

Tuyệt vời, chính xác những gì tôi cần. Điều đó nhắc nhở câu hỏi tiếp theo, làm thế nào tôi có thể loại bỏ các nhãn gốc (5.250 vv)? Tôi có thể xóa label2, nhưng những người khác vẫn ở đó – user3293938

Các vấn đề liên quan