扩展了2个子图的传奇

时间:2017-08-09 17:27:11

标签: python matplotlib legend subplot

如何在2个子图上显示相同的图例并使其在2上展开。是否有人知道,如果我必须分别为每个子图精确y标签,如果它是相同的(该图是用于科学论文)?我知道后一个问题与计算无关,但如果有人知道答案,我会很感激。

对于我使用的图例的放置:

        ax[0].legend(bbox_to_anchor=(0., 1.02, 1., .102), loc=3,
               ncol= 4, mode="expand", borderaxespad=0)

plots

2 个答案:

答案 0 :(得分:3)

要使图例在两个子图上展开,您需要调整给bbox_to_anchor的坐标。使用2.2作为宽度(第三个参数)覆盖了绘图宽度的2倍加上子图之间的间距。 (如果您的间距与默认值不同,例如f.tightlayout(),则需要调整此值。)

这是一个简单的工作示例:

import numpy as np
import matplotlib.pyplot as plt

x1 = np.linspace(0.0, 2.0)
x2 = np.linspace(0.0, 2.0)

y1 = np.cos(2 * np.pi * x1) * np.exp(-x1)
y2 = np.cos(2 * np.pi * x2)

f,ax = plt.subplots(1, 2)

ax[0].plot(x1, y1, 'ko-', label='Damped')
ax[0].plot(x2, y2, 'r.-', label='Undamped')
ax[1].plot(x1, y1, 'ko-', label='Damped')
ax[1].plot(x2, y2, 'r.-', label='Undamped')

ax[0].legend(bbox_to_anchor=(0., 1.02, 2.2, .102), loc=3,
               ncol=4, mode="expand", borderaxespad=0)

plt.show()

结果是这个情节:

enter image description here

答案 1 :(得分:2)

要在图中的所有子图上拉伸图例,您可以半自动化图例放置。使用图中的subplotpars可以找到所使用的间距,这样可以在bbox_to_anchor参数中直接使用这些间距。这需要通过bbox_transform参数将图例变换设置为图变换。您需要手动指定的唯一参数是轴和图例之间的间距(下例中为0.02)和图例的高度(下图中为0.05),均以图形高度为单位。

s = fig.subplotpars
bb=[s.left, s.top+0.02, s.right-s.left, 0.05 ]
leg = axes[0].legend(..., bbox_to_anchor=bb, mode="expand", borderaxespad=0,
                     bbox_transform=fig.transFigure)

一个完整的例子:

import matplotlib.pyplot as plt
import numpy as np

a = np.cumsum(np.random.rand(10,8), axis=0)

fig, axes = plt.subplots(ncols=2)

for i in range(a.shape[1]):
    axes[i//4].plot(a[:,i], marker="s", label="Label {}".format(i))

s = fig.subplotpars
bb=[s.left, s.top+0.02, s.right-s.left, 0.05 ]
leg = axes[0].legend(loc=8, bbox_to_anchor=bb, ncol= 4, mode="expand", borderaxespad=0,
                bbox_transform=fig.transFigure, fancybox=False, edgecolor="k")
leg.get_frame().set_linewidth(72./fig.dpi)
plt.show()

this page

至于你是否需要科学论文中的一两个传说,这完全取决于论文的风格。我猜想使用像这里这样的单个传说很好。但是,期刊主要要求您使用小写字母标记每个子图,例如ab(a)(b)