Matplotlib, usetex: шрифт Colorbar не соответствует шрифту графика

У меня есть график 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 не обрабатывает шрифт цветовой карты?

Спасибо!


person Tonkel    schedule 05.09.2016    source источник
comment
Я получаю ошибки при копировании этого кода. Возможно, это связано со мной, использующим OSX и python3.   -  person PdevG    schedule 05.09.2016
comment
Пример отлично работает здесь с OS X + Python 3   -  person Bart    schedule 05.09.2016
comment
@Skirrebattie На самом деле я также использую OS X + python 3. какие ошибки вы получаете?   -  person Tonkel    schedule 05.09.2016
comment
Обновил matplotlib, и ошибки исчезли, теперь возникают ошибки, связанные с tex. Сначала переустановите mactex, посмотрим, что произойдет;)   -  person PdevG    schedule 05.09.2016


Ответы (1)


Проблема здесь в том, что MPL оборачивает метки в $, когда usetex=True. Это приводит к тому, что их размеры отличаются от размера текста, который не заключен в $. Когда вы принудительно помечаете метки [1,2,3,4,5], эти значения не заворачиваются в $ и поэтому отображаются по-другому. Я не знаю подробностей, почему это происходит, но я уже сам сталкивался с этой проблемой.

Я бы рекомендовал обернуть галочки цветовой полосы в $, например:

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

Оттуда вы сможете выяснить, как настроить размеры / вес шрифта, чтобы они совпадали, и вы получали то, что хотите.

person farenorth    schedule 05.09.2016
comment
Вот и все! Спасибо Фаренорд! - person Tonkel; 06.09.2016