подрамник или субалбел или субслофта [дубликат]

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

77
задан jolindbe 22 April 2013 в 20:32
поделиться

6 ответов

123
ответ дан Community 20 August 2018 в 13:02
поделиться

Поскольку команда:

fig,ax = plt.subplots(5,2,sharex=True,sharey=True,figsize=fig_size)

, которую вы использовали, возвращает кортеж, состоящий из фигуры и списка экземпляров осей, уже достаточно сделать что-то вроде (помните, что я изменил fig,ax до fig,axes):

fig,axes = plt.subplots(5,2,sharex=True,sharey=True,figsize=fig_size)

for ax in axes:
    ax.set_xlabel('Common x-label')
    ax.set_ylabel('Common y-label')

Если вам захочется изменить некоторые детали на конкретном подзаголовке, вы можете получить к нему доступ через axes[i], где i выполняет итерацию по вашим подзадачам.

Также может быть очень полезно включить в конце файла

fig.tight_layout()

перед plt.show(), чтобы избежать наложения меток.

14
ответ дан astromax 20 August 2018 в 13:02
поделиться
  • 1
    Простите, я был немного неясен выше. С "общим" Я имел в виду один ярлык x ниже всех графиков, и один ярлык y слева от графиков, я обновил вопрос, чтобы отразить это. – jolindbe 22 April 2013 в 20:34
  • 2
    @JohanLindberg: Что касается ваших комментариев здесь и выше: Действительно plt.subplots() создаст новый экземпляр фигуры. Если вы хотите придерживаться этой команды, вы можете легко добавить big_ax = fig.add_subplot(111), так как у вас уже есть фигура и вы можете добавить другую ось. После этого вы можете манипулировать big_ax тем, как это показано в ссылке Hooked. – Marius 23 April 2013 в 09:13
  • 3
    Спасибо за ваши предложения, но если я это сделаю, мне нужно добавить big_ax после plt.subplots (), и я получу этот подзаговор поверх всего остального - могу ли я сделать его прозрачным или отправить его на задний план? Даже если я установил все цвета ни к чему, как в ссылке Hooked, это все еще белый ящик, охватывающий все мои подзадачи. – jolindbe 23 April 2013 в 12:49
  • 4
    @JohanLindberg, вы правы, я не проверял это. Но вы можете легко установить цвет фона большой оси на none, выполнив: big_ax.set_axis_bgcolor('none') Вы также должны сделать labelcolor none (в отличие от примера, связанного с Hooked): big_ax.tick_params(labelcolor='none', top='off', bottom='off', left='off', right='off') – Marius 23 April 2013 в 14:21
  • 5
    Я получаю сообщение об ошибке: AttributeError: 'numpy.ndarray' object has no attribute 'set_xlabel' в инструкции ax.set_xlabel('Common x-label'). Вы можете понять это? – hengxin 8 July 2014 в 03:44

Я столкнулся с подобной проблемой при построении сетки графиков. Графики состояли из двух частей (сверху и снизу). Предполагалось, что Y-метка была сосредоточена по обеим частям.

Я не хотел использовать решение, которое зависит от знания положения на внешней фигуре (например, fig.text ()), поэтому я манипулировал y-позиция функции set_ylabel (). Это обычно 0,5, середина графика, к которой он добавлен. Поскольку заполнение между частями (hspace) в моем коде было нулевым, я мог рассчитать середину двух частей относительно верхней части.

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec

# Create outer and inner grid
outerGrid = gridspec.GridSpec(2, 3, width_ratios=[1,1,1], height_ratios=[1,1])
somePlot = gridspec.GridSpecFromSubplotSpec(2, 1,
               subplot_spec=outerGrid[3], height_ratios=[1,3], hspace = 0)

# Add two partial plots
partA = plt.subplot(somePlot[0])
partB = plt.subplot(somePlot[1])

# No x-ticks for the upper plot
plt.setp(partA.get_xticklabels(), visible=False)

# The center is (height(top)-height(bottom))/(2*height(top))
# Simplified to 0.5 - height(bottom)/(2*height(top))
mid = 0.5-somePlot.get_height_ratios()[1]/(2.*somePlot.get_height_ratios()[0])
# Place the y-label
partA.set_ylabel('shared label', y = mid)

plt.show()

picture

Недостатки:

  • Горизонтальное расстояние до графика основано на верхней части, нижние тики могут распространяться на метку.
  • Формула не
  • Выдает исключение, если высота верхней части равна 0.

Возможно, существует общее решение, которое принимает отступы между фигурами во внимание.

2
ответ дан CPe 20 August 2018 в 13:02
поделиться

Это будет выглядеть лучше, если вы зарезервируете место для общих ярлыков, сделав невидимые ярлыки для подзаголовка в левом нижнем углу. Также полезно перейти в fontsize от rcParams. Таким образом, общие метки изменят размер с помощью вашей установки rc, а также будут отрегулированы оси, чтобы оставить место для общих меток.

fig_size = [8, 6]
fig, ax = plt.subplots(5, 2, sharex=True, sharey=True, figsize=fig_size)
# Reserve space for axis labels
ax[-1, 0].set_xlabel('.', color=(0, 0, 0, 0))
ax[-1, 0].set_ylabel('.', color=(0, 0, 0, 0))
# Make common axis labels
fig.text(0.5, 0.04, 'common X', va='center', ha='center', fontsize=rcParams['axes.labelsize'])
fig.text(0.04, 0.5, 'common Y', va='center', ha='center', rotation='vertical', fontsize=rcParams['axes.labelsize'])

0
ответ дан EL_DON 20 August 2018 в 13:02
поделиться

Я обнаружил более надежный метод:

Если вы знаете bottom и top kwargs, которые вошли в инициализацию GridSpec, или вы иначе знаете положения краев ваших осей в Figure, вы также можете указать положение ylabel в координатах Figure с помощью какой-то фантастической магии «преобразования». Например:

import matplotlib.transforms as mtransforms
bottom, top = .1, .9
f, a = plt.subplots(nrows=2, ncols=1, bottom=bottom, top=top)
avepos = (bottom+top)/2
a[0].yaxis.label.set_transform(mtransforms.blended_transform_factory(
       mtransforms.IdentityTransform(), f.transFigure # specify x, y transform
       )) # changed from default blend (IdentityTransform(), a[0].transAxes)
a[0].yaxis.label.set_position((0, avepos))
a[0].set_ylabel('Hello, world!')

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

Кроме того, если вы даже не используете set_position, то ярлык будет отображаться по умолчанию точно на полпути вверх. Я предполагаю, что это происходит потому, что, когда ярлык окончательно нарисован, matplotlib использует 0.5 для y -координата, не проверяя, изменилось ли базовое преобразование координат.

1
ответ дан Luke Davis 20 August 2018 в 13:02
поделиться

Без sharex=True, sharey=True вы получите:

enter image description here [/g0]

С его помощью вы должны получить его лучше:

fig, axes2d = plt.subplots(nrows=3, ncols=3,
                           sharex=True, sharey=True,
                           figsize=(6,6))

for i, row in enumerate(axes2d):
    for j, cell in enumerate(row):
        cell.imshow(np.random.rand(32,32))

plt.tight_layout()

enter image description here [/g1]

Но если вы хотите добавить дополнительные метки, вы должны добавить их только к графикам:

fig, axes2d = plt.subplots(nrows=3, ncols=3,
                           sharex=True, sharey=True,
                           figsize=(6,6))

for i, row in enumerate(axes2d):
    for j, cell in enumerate(row):
        cell.imshow(np.random.rand(32,32))
        if i == len(axes2d) - 1:
            cell.set_xlabel("noise column: {0:d}".format(j + 1))
        if j == 0:
            cell.set_ylabel("noise row: {0:d}".format(i + 1))

plt.tight_layout()

enter image description here [/g2]

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

28
ответ дан Piotr Migdal 20 August 2018 в 13:02
поделиться
  • 1
    Это намного сложнее, если, например, количество графиков неизвестно (например, у вас есть обобщенная функция графика, которая работает для любого количества подзаголовков). – naught101 27 January 2017 в 08:27
Другие вопросы по тегам:

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