首页 > 解决方案 > 图例句柄在 matplotlib 中未正确对齐

问题描述

我一次绘制 3 件事:一条多色线通过 a LineCollection(在this之后)和 a scatter(用于标记“覆盖”线条连接的位置)作为平均值,afill_between用于最小/最大值。我得到所有图例返回来绘制一个图例句柄。该图如下所示: 未对齐的图例句柄

可以注意到,圆形标记未与线对齐。我该如何调整这个?

绘制它们的代码和图例如下所示:

      lc = LineCollection(segments, cmap='turbo',zorder=3)
      p1 = ax.add_collection(lc)
      p2 = ax.fill_between(x, errmin,errmax, color=colors[1],zorder=2)
      ps = ax.scatter(x,y,marker='o',s=1,c=y,cmap='turbo',zorder=4)
      ax.legend([(p2, p1, ps)], ["(min/avg/max)"],fontsize=tinyfont, facecolor='white', loc='lower right')

标签: pythonmatplotliblegend

解决方案


图例有一个scatteryoffsets=默认为的参数[0.375, 0.5, 0.3125]。由于只显示了一个点,将其设置为[0.5]应该在图例标记的中心显示点。

要更改图例中线条的颜色,可以创建现有线条的副本,更改其颜色并使用该副本创建图例。

import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection
import numpy as np
from copy import copy

x = np.arange(150)
y = np.random.randn(150).cumsum()
y -= y.min()
y /= y.max()
errmin = 0
errmax = 1
segments = np.array([x[:-1], y[:-1], x[1:], y[1:]]).T.reshape(-1, 2, 2)

fig, ax = plt.subplots(figsize=(12, 3))

lc = LineCollection(segments, cmap='turbo', zorder=3)
lc.set_array(y[:-1])
p1 = ax.add_collection(lc)
p2 = ax.fill_between(x, errmin, errmax, color='lightblue', zorder=2, alpha=0.4)
ps = ax.scatter(x, y, marker='o', s=5, color='black', zorder=4)
p1copy = copy(p1)
p1copy.set_color('crimson')
leg = ax.legend([(p2, p1copy, ps)], ["(min/avg/max)"], fontsize=10, facecolor='white', loc='lower right',
                scatteryoffsets=[0.5])
ax.margins(x=0.02)
plt.show()

带有散点叠加在线上的图例


推荐阅读