Подтвердить что ты не робот

Matplotlib - глобальная легенда и название в сторону подзаголовков

Я начал с matplot и управлял некоторыми базовыми сюжетами, но теперь мне трудно понять, как сделать некоторые вещи, которые мне нужны сейчас: (

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

Я делаю 2x3 подсети, где у меня много разных графиков в разных цветах (около 200). Чтобы отличить (большинство) из них, я написал что-то вроде

def style(i, total):
    return dict(color=jet(i/total),
                linestyle=["-", "--", "-.", ":"][i%4],
                marker=["+", "*", "1", "2", "3", "4", "s"][i%7])

fig=plt.figure()
p0=fig.add_subplot(321)
for i, y in enumerate(data):
    p0.plot(x, trans0(y), "-", label=i, **style(i, total))
# and more subplots with other transN functions

(любые мысли по этому поводу?:)) Каждый подзаговор имеет ту же функцию стиля.

Теперь я пытаюсь получить глобальный заголовок для всех подзаговоров, а также глобальную легенду, которая объясняет все стили. Также мне нужно сделать шрифт крошечным, чтобы он соответствовал всем 200 стилям (мне не нужны совершенно уникальные стили, но, по крайней мере, некоторые попытки)

Может кто-нибудь помочь мне решить эту задачу?

4b9b3361

Ответ 1

Глобальный заголовок. В более новых версиях matplotlib можно использовать Figure.suptitle().

from pylab import *
fig = gcf()
fig.suptitle("Title centered above all subplots", fontsize=14)

Ответ 2

В дополнение к ответу orbeckst также может потребоваться переместить подзаголовки вниз. Здесь MWE в стиле ООП:

import matplotlib.pyplot as plt

fig = plt.figure()
st = fig.suptitle("suptitle", fontsize="x-large")

ax1 = fig.add_subplot(311)
ax1.plot([1,2,3])
ax1.set_title("ax1")

ax2 = fig.add_subplot(312)
ax2.plot([1,2,3])
ax2.set_title("ax2")

ax3 = fig.add_subplot(313)
ax3.plot([1,2,3])
ax3.set_title("ax3")

fig.tight_layout()

# shift subplots down:
st.set_y(0.95)
fig.subplots_adjust(top=0.85)

fig.savefig("test.png")

дает:

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

Ответ 3

Для ярлыков легенды можно использовать что-то вроде ниже. Legendlabels - это линии сюжета, сохраненные. modFreq - это имя фактических меток, соответствующих линиям графика. Тогда третий параметр - это местоположение легенды. Наконец, вы можете передать любые аргументы, как я здесь, но в первую очередь нужны первые три. Кроме того, предполагается, что вы правильно установите метки в команде plot. Чтобы просто вызвать легенду с параметром location и найти метки в каждой из строк. Мне повезло, что я сделал свою легенду, как показано ниже. Кажется, что он работает во всех случаях, когда никогда не казалось, что он поступает правильно. Если вы не понимаете, дайте мне знать:

legendLabels = []
for i in range(modSize):
    legendLabels.append(ax.plot(x,hstack((array([0]),actSum[j,semi,i,semi])), color=plotColor[i%8], dashes=dashes[i%4])[0]) #linestyle=dashs[i%4]       
legArgs = dict(title='AM Templates (Hz)',bbox_to_anchor=[.4,1.05],borderpad=0.1,labelspacing=0,handlelength=1.8,handletextpad=0.05,frameon=False,ncol=4, columnspacing=0.02) #ncol,numpoints,columnspacing,title,bbox_transform,prop
leg = ax.legend(tuple(legendLabels),tuple(modFreq),'upper center',**legArgs)
leg.get_title().set_fontsize(tick_size)

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

Глобальный заголовок, указанный в приведенном выше комментарии, может быть выполнен с добавлением текста по указанной ссылке: http://matplotlib.sourceforge.net/examples/pylab_examples/newscalarformatter_demo.html

f.text(0.5,0.975,'The new formatter, default settings',horizontalalignment='center',
       verticalalignment='top')

Ответ 4

suptitle кажется способным, но для того, что стоит, figure имеет свойство transFigure, которое вы можете использовать:

fig=figure(1)
text(0.5, 0.95, 'test', transform=fig.transFigure, horizontalalignment='center')