Matplotlib - легенда позиционирования при использовании plt.axis ('scaled') [duplicate]

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

Одной из возможных причин ошибок компоновщика с GCC 5.2.0 является то, что новая библиотека libstdc ++ ABI теперь выбран по умолчанию.

Если вы получаете ошибки компоновщика о неопределенных ссылках на символы, которые включают типы в пространстве имен std :: __ cxx11 или теге [abi: cxx11], то это, вероятно, указывает на то, что вы пытаетесь связать файлы объектов, которые были скомпилированы с различными значениями для макроса _GLIBCXX_USE_CXX11_ABI. Это обычно происходит при подключении к сторонней библиотеке, которая была скомпилирована с более старой версией GCC. Если сторонняя библиотека не может быть перестроена с новым ABI, вам нужно будет перекомпилировать свой код со старым ABI.

. Если вы вдруг получите ошибки компоновщика при переключении на GCC после 5.1.0 это было бы замечательно.

89
задан Elliot 12 August 2013 в 21:06
поделиться

5 ответов

Вы можете сделать это легко с помощью matplotlib AxisDivider .

Пример со связанной страницы также работает без использования подзаговоров:

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

plt.figure()
ax = plt.gca()
im = ax.imshow(np.arange(100).reshape((10,10)))

# create an axes on the right side of ax. The width of cax will be 5%
# of ax and the padding between cax and ax will be fixed at 0.05 inch.
divider = make_axes_locatable(ax)
cax = divider.append_axes("right", size="5%", pad=0.05)

plt.colorbar(im, cax=cax)

enter image description here [/g1]

120
ответ дан bogatron 24 August 2018 в 02:19
поделиться

Эта комбинация (и значения, близкие к этим), кажется, «магически» работает для меня, чтобы сохранить цветную шкалу, масштабированную до графика, независимо от размера дисплея.

plt.colorbar(im,fraction=0.046, pad=0.04)

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

112
ответ дан bejota 24 August 2018 в 02:19
поделиться

Все вышеперечисленные решения хороши, но мне нравится @ Steve's и @ bejota - лучшая, поскольку они не привлекают причудливых звонков и универсальны.

По универсальному я имею в виду, что работает с любым типом осей, включая GeoAxes. Например, у вас есть проецируемые оси для отображения:

projection = cartopy.crs.UTM(zone='17N')
ax = plt.axes(projection=projection)
im = ax.imshow(np.arange(200).reshape((20, 10)))

вызов

cax = divider.append_axes("right", size=width, pad=pad)

завершится с: KeyException: map_projection

единственный универсальный способ обработки colorbar со всеми типами осей:

ax.colorbar(im, fraction=0.046, pad=0.04)

Работайте с долей от 0,035 до 0,046, чтобы получить максимальный размер. Однако значения для фракции и paddig необходимо отрегулировать, чтобы наилучшим образом соответствовать вашему сюжету, и будут отличаться в зависимости от ориентации цветной панели в вертикальном положении или горизонтальном.

4
ответ дан Bogdan 24 August 2018 в 02:19
поделиться

@bogatron уже дал ответ, предложенный matplotlib docs , который создает правильную высоту, но он вводит другую проблему. Теперь ширина цветной панели (а также пространство между цветом и сюжетом) изменяется с шириной графика. Другими словами, соотношение сторон цветовой панели больше не фиксируется.

Чтобы получить как правильную высоту , так и заданное соотношение сторон, вам нужно углубиться в глубь таинственный axes_grid1 модуль.

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

aspect = 20
pad_fraction = 0.5

ax = plt.gca()
im = ax.imshow(np.arange(200).reshape((20, 10)))
divider = make_axes_locatable(ax)
width = axes_size.AxesY(ax, aspect=1./aspect)
pad = axes_size.Fraction(pad_fraction, width)
cax = divider.append_axes("right", size=width, pad=pad)
plt.colorbar(im, cax=cax)

Обратите внимание, что это указывает ширину цветной панели по height графика (в отличие от ширины фигуры, как это было раньше).

Интервал между цветовой панелью и графикой теперь можно указывается в виде доли ширины цветной панели, которая является ИМХО намного более значимым числом, чем доля ширины фигуры.

ОБНОВЛЕНИЕ :

Я создал записную книжку IPython по теме , где я упаковал вышеуказанный код в легко повторно используемую функцию:

import matplotlib.pyplot as plt
from mpl_toolkits import axes_grid1

def add_colorbar(im, aspect=20, pad_fraction=0.5, **kwargs):
    """Add a vertical color bar to an image plot."""
    divider = axes_grid1.make_axes_locatable(im.axes)
    width = axes_grid1.axes_size.AxesY(im.axes, aspect=1./aspect)
    pad = axes_grid1.axes_size.Fraction(pad_fraction, width)
    current_ax = plt.gca()
    cax = divider.append_axes("right", size=width, pad=pad)
    plt.sca(current_ax)
    return im.axes.figure.colorbar(im, cax=cax, **kwargs)

Он может можно использовать следующим образом:

im = plt.imshow(np.arange(200).reshape((20, 10)))
add_colorbar(im)
17
ответ дан Matthias 24 August 2018 в 02:19
поделиться

Когда вы создаете colorbar, попробуйте использовать параметры фракции и / или сжатия.

Из документов:

доля 0,15; доля исходных осей для использования в colorbar

shrink 1.0; фракция, с помощью которой можно уменьшить цветовую гамму

5
ответ дан Steve Barnes 24 August 2018 в 02:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: