Matplotlib,usetex:Colorbar' s字体与plot' s字体不匹配

时间:2016-09-05 11:16:44

标签: python matplotlib fonts styles tex

我有一个带有颜色条的matplotlib图,但似乎无法弄清楚如何匹配图的字体和颜色条。

我尝试使用usetex进行文本处理,但似乎只有情节的刻度受到影响,而不是颜色条的刻度。 此外,我已经搜索了相当多的解决方案,因此在下面的代码示例中,包含了一些不同的尝试,但结果仍然是粗体字。最小失败代码示例:

import matplotlib as mpl
import matplotlib.pyplot as plt
import sys
import colorsys
import numpy as np


mpl.rc('text', usetex=True)
plt.rcParams["font.family"] = "Times New Roman"
plt.rcParams["font.weight"] = 100
plt.rcParams["axes.labelweight"] = 100
plt.rcParams["figure.titleweight"] = 100


def draw():
    colors = [colorsys.hsv_to_rgb(0.33, step /15, 1) for step in [2, 5, 8, 11, 14]]
    mymap = mpl.colors.LinearSegmentedColormap.from_list('value',colors, N=5)

    Z = [[0,0],[0,0]]
    levels = range(2,15+4,3)
    CS3 = plt.contourf(Z, levels, cmap=mymap)
    plt.clf()

    plt.figure(figsize=(20, 15))
    plt.gca().set_aspect('equal')

    cbar = plt.colorbar(CS3, ax=plt.gca(), shrink=0.5, fraction=0.5, aspect=30, pad=0.05, orientation="horizontal")

    cbar.set_ticks([1.5 + x for x in [2,5,8,11,14]])

    # attempts to make the fonts look the same
    cbar.ax.set_xticklabels([1,2,3,4,5], weight="light", fontsize=16)
    cbar.set_label("value", weight="ultralight", fontsize=32)
    plt.setp(cbar.ax.xaxis.get_ticklabels(), weight='ultralight', fontsize=16)

    for l in cbar.ax.xaxis.get_ticklabels():
        l.set_weight("light")

    plt.show()

draw()

不幸的是,这些字体看起来并不相同。图片:

plot font and colorbar font are different

我确信这只是我对usetex的一个愚蠢的误解。为什么usetex似乎不能处理色彩映射的字体?

谢谢!

1 个答案:

答案 0 :(得分:1)

这里的问题是,当$时,MPL会在usetex=True中包含ticklabel。这导致它们的大小与未包含在$中的文本不同。当您强制刻度标记为[1,2,3,4,5]时,这些值不会包含在$中,因此会以不同方式呈现。我不知道为什么的详细信息,但我之前遇到过这个问题。

我建议在$中包装您的颜色条标记,例如:

cbar.ax.set_xticklabels(['${}$'.format(tkval) for tkval in [1, 2, 3, 4, 5]])

从那里你应该能够弄清楚如何调整字体大小/重量,使它们匹配,你得到你想要的。