Matplotlib - глобальна легенда та підзаголовок під заголовком


125

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

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

Я роблю 2x3 subplots, де у мене дуже багато різних графіків у різних кольорах (близько 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 стилів там (мені не потрібні абсолютно унікальні стилі, але хоча б певна спроба)

Чи може хтось допомогти мені вирішити це завдання?


Відповіді:


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)

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

На додаток до найвищої відповіді, можливо, також слід змістити підскладки вниз. Ось MWE у стилі OOP:

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
це має бути найкращою відповіддю
Стейт

Домовились! Прийнята відповідь вводить іншу залежність, отже, не відповідає належним чином на питання ОП.
Йохан Обадія

7

Для міток легенди можна використовувати щось на кшталт нижче. Легендарні позначки - це збережені лінії сюжету. 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')
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.