Цветовая панель Matplotlib: __init__() получил неожиданный аргумент ключевого слова ‘location’

#python #matplotlib #plot #colorbar

Вопрос:

Я пытался построить цветовую панель matplotlib слева от моей оси, следуя приведенному здесь примеру: https://matplotlib.org/stable/gallery/axes_grid1/simple_colorbar.html#sphx-glr-gallery-axes-grid1-simple-colorbar-py

Но поскольку я хотел, чтобы цветовая панель находилась с левой стороны оси, я попытался:

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

fig, ax = plt.subplots(1, 1)

im = plt.imshow(np.arange(0, 100).reshape(10, 10))
ax.set_xticklabels([])
ax.set_yticklabels([])

divider = make_axes_locatable(ax)
cax = divider.append_axes("left", size="5%", pad=0.05)
colorbar = fig.colorbar(im, cax=cax, location='left')
colorbar.set_label('y label')
 

что дает мне следующее исключение:

 ---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-6-89d8edf2c11c> in <module>
     11 divider = make_axes_locatable(ax)
     12 cax = divider.append_axes("left", size = "5%", pad = 0.05)
---> 13 colorbar = fig.colorbar(im, cax = cax, location = 'left')
     14 colorbar.set_label('y label')
     15 

~Anaconda3envsdata-evaluationlibsite-packagesmatplotlibfigure.py in colorbar(self, mappable, cax, ax, use_gridspec, **kw)
   1171                              'panchor']
   1172         cb_kw = {k: v for k, v in kw.items() if k not in NON_COLORBAR_KEYS}
-> 1173         cb = cbar.Colorbar(cax, mappable, **cb_kw)
   1174 
   1175         self.sca(current_ax)

~Anaconda3envsdata-evaluationlibsite-packagesmatplotlibcolorbar.py in __init__(self, ax, mappable, **kwargs)
   1195             if isinstance(mappable, martist.Artist):
   1196                 _add_disjoint_kwargs(kwargs, alpha=mappable.get_alpha())
-> 1197             super().__init__(ax, **kwargs)
   1198 
   1199         mappable.colorbar = self

~Anaconda3envsdata-evaluationlibsite-packagesmatplotlib_apideprecation.py in wrapper(*args, **kwargs)
    469                 "parameter will become keyword-only %(removal)s.",
    470                 name=name, obj_type=f"parameter of {func.__name__}()")
--> 471         return func(*args, **kwargs)
    472 
    473     return wrapper

TypeError: __init__() got an unexpected keyword argument 'location'
 

Почему это? Если я использую:

 colorbar = fig.colorbar(im, ax=ax, location='left')
colorbar.set_label('y label')
 

вместо divider этого, похоже, это работает, но отступ между осью и цветовой панелью не такой маленький, как я хочу.

Ответ №1:

Приведенный вами пример не использует location аргумент для colorbar :

 colorbar = fig.colorbar(im, cax=cax)
 

Это потому, что вы просите его отобразить цветовую панель в новых осях, которые вы уже разместили слева с помощью инструкции cax = divider.append_axes("left", size="5%", pad=0.05) . Вы можете видеть, что для цветовой панели создается пустая ось перед выдачей ошибки.

Имейте в виду, что выполнение этого таким образом приведет к инвертированию размещения тиков и метки вашей цветовой панели:

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

Вы можете избежать этого, добавив следующее после рисования цветовой панели (поскольку цветовая панель отменит изменение):

 cax.yaxis.tick_left()
cax.yaxis.set_label_position('left')
 

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

Комментарии:

1. Спасибо, это работает. Я знаю, что в примере не использовался аргумент location, но я предположил, что он будет упомянут в документации, если аргумент location не поддерживается в сочетании с cax.

2. @tim. На самом деле это довольно хороший момент. Вы можете рассмотреть вопрос о возникновении проблемы в системе отслеживания ошибок matplotlib, указав на этот вопрос. Если вы хотите, вы даже можете задокументировать проблему и сделать запрос на извлечение.