【问题标题】:Expanded legend over 2 subplots扩展图例超过 2 个子图
【发布时间】:2018-01-17 17:19:37
【问题描述】:

我怎样才能让相同的图例出现在 2 个子图上并使其扩展到 2 个子图上。有谁知道,如果我必须分别精确每个子图的 y 标签,如果它是相同的(该图适用于科学论文)?我知道后一个问题与计算无关,但如果有人知道答案,我将不胜感激。

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

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

【问题讨论】:

  • 这是一个 matplolib 问题吗?
  • 是的。不适合这个论坛吗?
  • 适合。它可能会收到更多带有 matplotlib 标签的答案。我会添加它。

标签: python matplotlib legend subplot


【解决方案1】:

要在图中的所有子图中拉伸图例,您可以半自动放置图例。使用图中的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()

至于在一篇科学论文中是否需要一个或两个图例,这完全取决于论文的风格。我猜想使用像这里这样的单个图例就可以了。然而,期刊大多要求您用小写字母标记每个子图,例如 ab(a)(b)

【讨论】:

    【解决方案2】:

    要使图例跨越两个子图,您需要调整给定给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()
    

    结果是这样的情节:

    【讨论】:

    • 谢谢,这正是我所需要的
    猜你喜欢
    • 2023-03-15
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    相关资源
    最近更新 更多