Get legend as a separate picture in Matplotlib

后端 未结 9 896
情歌与酒
情歌与酒 2020-11-29 03:50

I\'m developing a Web application and want to display a figure and its legend in different locations on the page. Which means I need to save the legend as a separate png fil

相关标签:
9条回答
  • 2020-11-29 04:37

    This calculates the size of the legend automatically. If mode == 1, the code is similar to Steve Tjoa's answer, while mode == 2 is similar Andre Holzner's answer.

    The loc parameter must be set to 'center' to make it work (but I do not know why this is necessary).

    mode = 1
    #mode = 2
    
    import pylab
    fig = pylab.figure()
    if mode == 1:
        lines = fig.gca().plot(range(10), pylab.randn(10), range(10), pylab.randn(10))
        legend_fig = pylab.figure(figsize=(3,2))
        legend = legend_fig.legend(lines, ('one', 'two'), 'center')
    if mode == 2:
        fig.gca().plot(range(10), pylab.randn(10), range(10), pylab.randn(10), label='asd')
        legend_fig = pylab.figure()
        legend = pylab.figlegend(*fig.gca().get_legend_handles_labels(), loc = 'center')
    legend.get_frame().set_color('0.70')
    legend_fig.canvas.draw()
    legend_fig.savefig('legend_cropped.png',
        bbox_inches=legend.get_window_extent().transformed(legend_fig.dpi_scale_trans.inverted()))
    legend_fig.savefig('legend_original.png')
    

    Original (uncropped) legend:

    Original (uncropped) legend

    Cropped legend:

    Cropped legend

    0 讨论(0)
  • 2020-11-29 04:39

    use pylab.figlegend(..) and get_legend_handles_labels(..):

    import pylab, numpy 
    x = numpy.arange(10)
    
    # create a figure for the data
    figData = pylab.figure()
    ax = pylab.gca()
    
    for i in xrange(3):
        pylab.plot(x, x * (i+1), label='line %d' % i)
    
    # create a second figure for the legend
    figLegend = pylab.figure(figsize = (1.5,1.3))
    
    # produce a legend for the objects in the other figure
    pylab.figlegend(*ax.get_legend_handles_labels(), loc = 'upper left')
    
    # save the two figures to files
    figData.savefig("plot.png")
    figLegend.savefig("legend.png")
    

    It can be tricky though to get the size of the legend figure right in an automated manner.

    0 讨论(0)
  • 2020-11-29 04:40

    It is possible to use axes.get_legend_handles_labels to get the legend handles and labels from one axes object and to use them to add them to an axes in a different figure.

    # create a figure with one subplot
    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.plot([1,2,3,4,5], [1,2,3,4,5], 'r', label='test')
    # save it *without* adding a legend
    fig.savefig('image.png')
    
    # then create a new image
    # adjust the figure size as necessary
    figsize = (3, 3)
    fig_leg = plt.figure(figsize=figsize)
    ax_leg = fig_leg.add_subplot(111)
    # add the legend from the previous axes
    ax_leg.legend(*ax.get_legend_handles_labels(), loc='center')
    # hide the axes frame and the x/y labels
    ax_leg.axis('off')
    fig_leg.savefig('legend.png')
    

    If for some reason you want to hide only the axes label, you can use:

    ax.xaxis.set_visible(False)
    ax.yaxis.set_visible(False)
    

    or if, for some weirder reason, you want to hide the axes frame but not the axes labels you can use:

    ax.set_frame_on(False)
    

    ps: this answer has been adapted from my answer to a duplicate question

    0 讨论(0)
提交回复
热议问题