我有一个带有颜色条的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()
不幸的是,这些字体看起来并不相同。图片:
我确信这只是我对usetex的一个愚蠢的误解。为什么usetex似乎不能处理色彩映射的字体?
谢谢!
答案 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]])
从那里你应该能够弄清楚如何调整字体大小/重量,使它们匹配,你得到你想要的。