我可以使用matplotlib制作图例显示框图吗?

时间:2019-12-10 20:36:35

标签: python matplotlib legend-properties

我正在使用一种非常规的方法通过箱形图来传达数据;但是,该图显示的是箱形图而不是分布图,这并不是立即显而易见的。因此,我想使图例显示少量彩色编码的箱形图(现在它显示线条)。有办法吗?

我目前正在使用通过创建几个Line2D对象制作的自定义图例。我希望有一种方法来制作带有小方框图而不是线条的自定义图例。

1 个答案:

答案 0 :(得分:1)

基于the answer from @ImportanceOfBeingErnestsome hack I wrote a while ago,我创建了一个图例处理程序,该图例处理程序绘制了箱形图。它是由Line2D艺术家获得的颜色,根据您的使用情况,颜色可能合适也可能不合适。

from matplotlib.legend_handler import HandlerBase

class HandlerBoxPlot(HandlerBase):
    def create_artists(self, legend, orig_handle,
                   xdescent, ydescent, width, height, fontsize,
                   trans):
        a_list = []
        a_list.append(matplotlib.lines.Line2D(np.array([0, 0, 1, 1, 0])*width-xdescent, 
                                              np.array([0.25, 0.75, 0.75, 0.25, 0.25])*height-ydescent)) # box

        a_list.append(matplotlib.lines.Line2D(np.array([0.5,0.5])*width-xdescent,
                                              np.array([0.75,1])*height-ydescent)) # top vert line

        a_list.append(matplotlib.lines.Line2D(np.array([0.5,0.5])*width-xdescent,
                                              np.array([0.25,0])*height-ydescent)) # bottom vert line

        a_list.append(matplotlib.lines.Line2D(np.array([0.25,0.75])*width-xdescent,
                                              np.array([1,1])*height-ydescent)) # top whisker

        a_list.append(matplotlib.lines.Line2D(np.array([0.25,0.75])*width-xdescent,
                                              np.array([0,0])*height-ydescent)) # bottom whisker

        a_list.append(matplotlib.lines.Line2D(np.array([0,1])*width-xdescent,
                                              np.array([0.5,0.5])*height-ydescent, lw=2)) # median
        for a in a_list:
            a.set_color(orig_handle.get_color())
        return a_list

fig, ax = plt.subplots()

l1, = ax.plot([0,1],[0,1],c='C0')
l2, = ax.plot([1,0],[0,1],c='C1')

ax.legend([l1,l2], ["legend 1", "legend 2"], handler_map={l1:HandlerBoxPlot(), l2:HandlerBoxPlot()}, handleheight=3)

enter image description here