Matplotlib - 全局图例和标题旁边的子图
Posted
技术标签:
【中文标题】Matplotlib - 全局图例和标题旁边的子图【英文标题】:Matplotlib - global legend and title aside subplots 【发布时间】:2011-11-23 12:09:55 【问题描述】:我从 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 种样式(我不需要完全独特的样式,但至少需要一些尝试)
谁能帮我解决这个问题?
【问题讨论】:
全局标题:matplotlib.sourceforge.net/examples/pylab_examples/… 【参考方案1】:全局标题:在较新版本的 matplotlib 中,可以使用 Figure
的 Figure.suptitle() 方法:
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)
【讨论】:
对于像这样导入的:import matplotlib.pyplot as plt
,命令可以简单地输入为plt.figure(); plt.suptitle('Title centered above all subplots'); plt.subplot(231); plt.plot(data[:,0], data[:,1]);
等...
谢谢。这应该是实际选择的答案。【参考方案2】:
除了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")
给予:
【讨论】:
这应该是最好的答案 同意!接受的答案引入了另一个依赖项,因此不能正确回答 OP 问题。【参考方案3】:对于图例标签,可以使用如下所示的内容。图例标签是保存的情节线。 modFreq 是对应于绘图线的实际标签的名称。那么第三个参数就是图例的位置。最后,您可以像我在这里一样传递任何参数,但主要需要前三个。此外,如果您在绘图命令中正确设置标签,您应该这样做。只需使用 location 参数调用 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)
您还可以使用腿来更改字体大小或图例的几乎任何参数。
上述评论中所述的全局标题可以通过根据提供的链接添加文本来完成: 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')
【讨论】:
以上是关于Matplotlib - 全局图例和标题旁边的子图的主要内容,如果未能解决你的问题,请参考以下文章