matplotlib 全局图例和标题旁子图

vbopmzt1  于 2023-10-24  发布在  其他
关注(0)|答案(4)|浏览(119)

我已经开始与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

(any对这个有什么看法?:))每个子情节都有相同的风格功能。
现在,我试图得到一个全球所有的子情节标题,也是一个全球性的传奇,解释所有的风格。我还需要使字体微小,以适应所有200风格在那里(我不需要完全独特的风格,但至少有一些尝试)
有人能帮我解决这个问题吗?

42fyovps

42fyovps1#

全局标题:在matplotlib的新版本中,可以使用FigureFigure.suptitle()方法:

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

或者(基于@Steven C.豪厄尔下面的评论(谢谢!)),使用matplotlib.pyplot.suptitle()函数:

import matplotlib.pyplot as plt
 # plot stuff
 # ...
 plt.suptitle("Title centered above all subplots", fontsize=14)
z4bn682m

z4bn682m2#

除了orbeckst answer之外,你可能还想向下移动子图。下面是一个OOP风格的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")

给出:

hrirmatl

hrirmatl3#

对于图例标签,可以使用下面的内容。Legendlabels是保存的绘图线。modFreq是与绘图线对应的实际标签的名称。然后第三个参数是图例的位置。最后,您可以传入任何参数,因为我在这里,但主要需要前三个参数。此外,如果你在plot命令中正确设置了标签,你应该这样做。只要用location参数调用legend,它就会在每一行中找到标签。我有更好的运气来制作我自己的legend,如下所示。似乎在所有的情况下,似乎从来没有得到另一种方式去正确。如果你不明白,让我知道:

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)

您还可以使用leg更改字体大小或图例的几乎任何参数。
上面评论中所述的全局标题可以通过根据提供的链接添加文本来完成: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')
4ktjp1zp

4ktjp1zp4#

suptitle看起来是个不错的选择,但值得一提的是,figure有一个transFigure属性,你可以用途:

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

相关问题