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

125

Я начал с 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 стилям (мне не нужны полностью уникальные стили, но по крайней мере некоторые попытки)

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

Gerenuk
источник
1
Глобальный заголовок: matplotlib.sourceforge.net/examples/pylab_examples/…
ev-br

Ответы:

192

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

import matplotlib.pyplot as plt
fig = plt.gcf()
fig.suptitle("Title centered above all subplots", fontsize=14)

В качестве альтернативы (на основе комментария @Steven C.Howell ниже (спасибо!)) Используйте функцию matplotlib.pyplot.suptitle () :

 import matplotlib.pyplot as plt
 # plot stuff
 # ...
 plt.suptitle("Title centered above all subplots", fontsize=14)
orbeckst
источник
64
Для тех import matplotlib.pyplot as plt, кто выполняет импорт таким образом:, команда может быть введена просто как и plt.figure(); plt.suptitle('Title centered above all subplots'); plt.subplot(231); plt.plot(data[:,0], data[:,1]);т.д ...
Стивен К. Хауэлл
1
Спасибо. Это должен быть фактически выбранный ответ.
gustafbstrom
62

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

дает:

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

саман
источник
2
это должен быть лучший ответ
Стэтхэм
Согласовано ! Принятый ответ вводит другую зависимость, следовательно, не отвечает должным образом на вопрос OP.
Йохан Обадиа,
7

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

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')
mathtick
источник