如何为一个绘图实例创建两个图例对象?

时间:2018-08-27 11:21:25

标签: python-3.x matplotlib bar-chart legend

我使用以下示例代码生成条形图。

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 5, 5)
y = np.exp(x)
w = x[1] - x[0]

colors = ['blue' if idx % 2 == 0 else 'red' for idx in range(len(x))]

fig, ax = plt.subplots()
ax.bar(x, y, width=w, color=colors, label='sample plot')
ax.legend()
plt.show()
plt.close(fig)

Bar plot

我想在图例对象中同时显示红色和蓝色。我可以想到2个吸引人的想法。第一个想法是创建两个围绕图例标签垂直居中的矩形对象(一个红色,另一个蓝色)。第二个想法是在图例对象(蓝色)上覆盖一个矩形的一半(红色)。但是我不知道如何实现这两个目标。我看了matplotlib文档,我很困惑。我该怎么做呢?

1 个答案:

答案 0 :(得分:3)

我想一个简单的选择是使用matplotlib.legend_handler.HandlerTuple并为图例句柄提供一个红色和蓝色矩形的元组。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.legend_handler

x = np.linspace(0, 5, 5)
y = np.exp(x)
w = x[1] - x[0]

colors = ['blue' if idx % 2 == 0 else 'red' for idx in range(len(x))]

fig, ax = plt.subplots()
bars = ax.bar(x, y, width=w, color=colors, label='sample plot')

ax.legend(handles = [tuple(bars[:2])], labels=['sample plot'], loc='upper left', 
          handler_map = {tuple: matplotlib.legend_handler.HandlerTuple(None)})

plt.show()

enter image description here

否则,您当然可以使用the legend guide中所述的任何自定义处理程序。