На самом деле мы используем статические свойства и методы в классе, когда мы хотим использовать часть нашей программы, которая должна существовать там до тех пор, пока наша программа не будет запущена. И мы знаем, что для управления статическими свойствами нам нужны статические методы, поскольку они не являются частью переменной экземпляра. И без статических методов управлять статическими свойствами занимает много времени.
Поскольку команда:
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()
, чтобы избежать наложения меток.
plt.subplots()
создаст новый экземпляр фигуры. Если вы хотите придерживаться этой команды, вы можете легко добавить big_ax = fig.add_subplot(111)
, так как у вас уже есть фигура и вы можете добавить другую ось. После этого вы можете манипулировать big_ax
тем, как это показано в ссылке Hooked.
– Marius
23 April 2013 в 09:13
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
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()
Недостатки:
Возможно, существует общее решение, которое принимает отступы между фигурами во внимание.
Это будет выглядеть лучше, если вы зарезервируете место для общих ярлыков, сделав невидимые ярлыки для подзаголовка в левом нижнем углу. Также полезно перейти в 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'])
Я обнаружил более надежный метод:
Если вы знаете 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
-координата, не проверяя, изменилось ли базовое преобразование координат.
Без sharex=True, sharey=True
вы получите:
[/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()
[/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()
[/g2]
Добавление метки для каждого графика испортит ее (возможно, есть способ автоматически обнаруживать повторяющиеся метки, но я не знаю об этом).