Почему этот код для маркировки цветовых полос работает с Matplotlib 2.2.3, но не с Matplotlib 3.0.1? - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть следующий код:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable, axes_size

arr = np.random.randint(0, 100, (2, 3, 4))

fig, ax = plt.subplots(1, 1)   
pax = ax.imshow(arr, vmin=0, vmax=100)

cbar_kws=dict(ticks=(0, 100))
cbar_txt='arb. units'
divider = make_axes_locatable(ax)
cax = divider.append_axes('right', size='5%', pad=0.05)
cbar = ax.figure.colorbar(pax, cax=cax, **dict(cbar_kws))
# cbar = ax.figure.colorbar(plot, ax=ax, **dict(cbar_kws))
if cbar_txt is not None:
    only_extremes = 'ticks' in cbar_kws and len(cbar_kws['ticks']) == 2
    if only_extremes:
        cbar.ax.text(
            2.0, 0.5, cbar_txt, fontsize='medium', rotation=90,
            va='center', ha='left')
    else:
        cbar.set_label(cbar_txt)

plt.tight_layout()
plt.show()

Это прекрасно работает для Matplotlib 2.2.3, где я получаю текст в середине цветовой шкалы (справа):

figure_with_matplotlib_2.2.3_correct_text

Но не работает так же для Matplotlib 3.0.1, где текст отображается в нижней части цветовой шкалы:

figure_with_matplotlib_3.0.1_correct_text

Почему?Любое предложение для получения того же поведения с обеими версиями?

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018

Почему бы не использовать этикетку напрямую?Изменить: не видел ответ ниже.См. Для лучшего объяснения.

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable, axes_size

arr = np.random.randint(0, 100, (2, 3, 4))

fig, ax = plt.subplots(1, 1)   
pax = ax.imshow(arr, vmin=0, vmax=100)
cbar_txt='arb. units'
cbar_kws=dict(ticks=(0, 100))


divider = make_axes_locatable(ax)
cax = divider.append_axes('right', size='5%', pad=0.05)
cbar = ax.figure.colorbar(pax, cax=cax, **dict(cbar_kws))
cbar.set_label(cbar_txt, size = 20)
cbar.ax.tick_params(labelsize = 10)
plt.tight_layout()
plt.show()

enter image description here

0 голосов
/ 07 декабря 2018

Как

Использование cbar.ax.text кажется обходным решением для некоторых других проблем.Рекомендуемый способ установить метку для цветовой панели - либо через сам вызов colorbar, либо через cbar.set_label("label").

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable

arr = np.random.randint(0, 100, (2, 3))

fig, ax = plt.subplots(1, 1)   
pax = ax.imshow(arr, vmin=0, vmax=100)

cbar_kws=dict(ticks=(0, 100))
cbar_txt='arb. units'
divider = make_axes_locatable(ax)
cax = divider.append_axes('right', size='5%', pad=0.05)
cbar = ax.figure.colorbar(pax, cax=cax, **dict(cbar_kws))
cbar.set_label(cbar_txt, labelpad=-12)

plt.tight_layout()
plt.show()

Результат одинаков в matplotlib 2.2.3 и 3.0.1:

enter image description here

Для расстояния до меткинезависимо от длины меток цветовой полосы, вы можете пометить левую сторону цветовой шкалы и еще больше сместить метку.

cbar.set_label(cbar_txt, labelpad=-36)
cbar.ax.yaxis.set_label_position("left")

Наконец, вы действительно можете использовать текст на осях, но расположить его на осях.координаты вместо координат данных,

cbar.ax.text(2, 0.5, cbar_txt, fontsize='medium', rotation=90,
             va='center', ha='left', transform=cbar.ax.transAxes)

Почему

Относительно того, почему cbar.ax.text работает по-разному в разных версиях: внутренние единицы цветовой шкалы изменились.Это не должно влиять на любое внешнее приложение, но облегчает применение различных локаторов к цветным полосам.На самом деле это стало более последовательным.Например, если диапазон цветовой шкалы составляет от 0 до 100, и вы помещаете текст в y = 0.5, он будет очень близок к 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...