Смещение научной нотации Matplotlib Colorbar

При построении цветной полосы верхняя метка (я думаю, это будет называться смещением) смещена по центру. Раньше этого не происходило, у меня есть примеры старого кода, где он располагался по центру над цветовой полосой, но я понятия не имею, что изменилось.

Пример:

import numpy as np
import matplotlib.pyplot as plt

z = np.random.random((10,10))

fig, ax = plt.subplots()
im = ax.imshow(z)
cb = fig.colorbar(im)

cb.formatter.set_powerlimits((0, 0))
cb.update_ticks()

plt.show()

Дает это:

Смещение обозначения цветовой полосы

В качестве примера того, как это выглядело (взято из одной из моих старых работ, поэтому разные данные и т. д.)

Правильное обозначение цветовой шкалы

Использование самой последней версии anaconda python 2.7 на MacOSX, версия mpl 1.5.0

Изменить: я также должен отметить, что tight_layout() также не улучшает этого, хотя он отсутствует в рабочем примере.


person ajclarke    schedule 02.12.2015    source источник
comment
Более прямое сравнение в этом ответе SO.   -  person    schedule 02.12.2015
comment
Я предполагаю, что эта цифра является единственной причиной, по которой jet не следует удалять из цветовой карты, а все еще имеет свое применение: я могу смотреть на него бесконечно и медленно уплывать в какую-то форму гиперпространства.   -  person    schedule 02.12.2015


Ответы (2)


Вы можете просто использовать set_offset_position для оси Y цветовой полосы. Сравнивать:

fig, ax = plt.subplots()                
im = ax.imshow(np.random.random((10,10)))                    
cb = fig.colorbar(im)     
cb.formatter.set_powerlimits((0, 0))
cb.ax.yaxis.set_offset_position('right')                         
cb.update_ticks()
plt.show()

введите описание изображения здесь

против

fig, ax = plt.subplots()
im = ax.imshow(np.random.random((10,10)))
cb = fig.colorbar(im)
cb.formatter.set_powerlimits((0, 0))
cb.ax.yaxis.set_offset_position('left')
cb.update_ticks()
plt.show()

введите описание изображения здесь

В целом, это просто выглядит так, как будто значение по умолчанию изменилось справа налево.

person Community    schedule 02.12.2015
comment
Замечательно, я выберу это как ответ, поскольку он не требует понижения версии. Большое спасибо! Путаница с левым/правым, однако, вы должны использовать левую, чтобы переместить метку вправо! Странный! - person ajclarke; 02.12.2015
comment
@ajclarke Я думаю, что left означает выравнивание левого края метки с левой стороной цветной полосы, тогда как right означает выравнивание правой стороны метки с правой стороной цветной полосы. - person tmdavison; 02.12.2015
comment
Да, похоже, как упоминает Том. К сожалению, это одна из частей, где документация все еще не хватает matplotlib. К счастью, в mpl есть масса примеров, которые лучше подходят для документации. - person ; 02.12.2015

Используя приведенный выше код и matplotlib версии 1.4.3, я получаю следующий график введите здесь описание изображения

Так что это может быть проблема версии. Одним из возможных обходных путей может быть использование cb.ax.text()

# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt

z = np.random.random((10,10))

fig, ax = plt.subplots()
im = ax.imshow(z)
cb = fig.colorbar(im)
cb.ax.text(-0.25, 1, r'$\times$10$^{-1}$', va='bottom', ha='left')

plt.show()

Таким образом, у вас будет больше контроля над центрированием. Приведенный выше код дает мне следующий график введите здесь описание изображения Обратите внимание, что я использую r в начале строки, так что $\times$ создает правильный символ.

person Andy    schedule 02.12.2015
comment
Могу подтвердить, переход на 1.4.3 устраняет эту проблему. Я могу жить с использованием этой версии. Единственное, чего я не понимаю, так это почему цветовая полоса в вашем примере не имеет смещения от самой plt.colorbar. Когда я это делаю, cb.ax.text просто плюхается поверх метки смещения цветовой полосы по умолчанию. - person ajclarke; 02.12.2015
comment
Я думаю, это потому, что я удалил следующие строки: cb.formatter.set_powerlimits((0, 0)) и cb.update_ticks() - person Andy; 02.12.2015