Matplotlib - глобальная легенда и заглавие - PullRequest
98 голосов
/ 23 сентября 2011

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

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

Я делаю субплоты 2х3, где у меня много разных графиков разных цветов (около 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 стилям (мне не нужны совершенно уникальные стили, но, по крайней мере, некоторые попытки)

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

Ответы [ 4 ]

160 голосов
/ 10 февраля 2012

Глобальное название : в более новых выпусках matplotlib можно использовать Figure.suptitle () .

from pylab import *
fig = gcf()
fig.suptitle("Title centered above all subplots", fontsize=14)
48 голосов
/ 21 августа 2015

В дополнение к 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")

дает:

enter image description here

7 голосов
/ 23 сентября 2011

Для надписей легенды можно использовать что-то вроде ниже. Легендарные метки - это сохраненные линии сюжета. 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')
3 голосов
/ 15 октября 2012

suptitle кажется подходящим вариантом, но для 1002 * есть свойство transFigure, которое вы можете использовать:

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