Matplotlib:绘制自定义图例

时间:2019-01-18 23:39:44

标签: python matplotlib

我遇到的情况是,我已经在matplotlib图上绘制了内容,并且散点图形状映射到了标签类型。

例如:

's': "X"
'o': "Y"

但是,我用网络x作图。现在,我想添加一个显示此映射的图例,然后可以使用plt方法修改该图。

所以我需要以某种方式plt.legend

plt.legend(('s','o'),("X","Y"))

但是从文档中尚不清楚如何完成此任务。有没有办法在matplotlib中绘制这样的自定义图例?

2 个答案:

答案 0 :(得分:1)

从您的问题中不清楚映射的含义。如果您希望将图例手柄从默认标记修改为自定义变量标记,则可以执行以下操作。我的解决方案基于this答案,但简化为一个简单的案例。不要忘记赞成原始答案。我已经承认了。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.lines import Line2D

fig, ax = plt.subplots()

new_legends = ["X", "Y"]
markers = ['s', 'o']
colors = ['r', 'b']

x = np.arange(5)
plt.plot(x, 1.5*x, marker=markers[0], color=colors[0], label='squares')
plt.plot(x, x, marker=markers[1], color=colors[1], label='circles')

_, labels = ax.get_legend_handles_labels()

def dupe_legend(label, color):
    line = Line2D([0], [0], linestyle='none', mfc='black',
                mec=color, marker=r'$\mathregular{{{}}}$'.format(label))
    return line

duplicates = [dupe_legend(leg, color) for leg, color in zip(new_legends, colors)]
ax.legend(duplicates, labels, numpoints=1, markerscale=2, fontsize=16)
plt.show()

enter image description here

答案 1 :(得分:0)

Axis对象上绘制内容时,可以传递label关键字参数:

fig, ax = plt.subplots(figsize=(8, 8))

n_points = 10
x1 = np.random.rand(n_points)
y1 = np.random.rand(n_points)
x2 = np.random.rand(n_points)
y2 = np.random.rand(n_points)

ax.scatter(x1, y1, marker='x', label='X')
ax.scatter(x2, y2, marker='o', label='y')
ax.legend()

这会产生如下结果:

enter image description here