改变轮廓clabel文本对象的方向

时间:2016-02-19 13:11:49

标签: python matplotlib contour

我正在使用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()

1 个答案:

答案 0 :(得分: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