我正在使用一种非常规的方法通过箱形图来传达数据;但是,该图显示的是箱形图而不是分布图,这并不是立即显而易见的。因此,我想使图例显示少量彩色编码的箱形图(现在它显示线条)。有办法吗?
我目前正在使用通过创建几个Line2D对象制作的自定义图例。我希望有一种方法来制作带有小方框图而不是线条的自定义图例。
答案 0 :(得分:1)
基于the answer from @ImportanceOfBeingErnest和some 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)