using mpatches.Patch for a custom legend

后端 未结 2 1417
别那么骄傲
别那么骄傲 2020-12-03 08:29

I\'m using the following code to create a custom matplotlib legend.

import matplotlib.patches as mpatches
import matplotlib.pyplot as plt
colors = [\"g\", \"         


        
相关标签:
2条回答
  • 2020-12-03 09:18
    1. Setting the legend's background color can be done using the facecolor argument to plt.legend(),

       plt.legend(facecolor="plum")
      
    2. To obtain a circular shaped legend handle, you may use a standard plot with a circular marker as proxy artist,

       plt.plot([],[], marker="o", ms=10, ls="")
      

    Complete example:

    import matplotlib.patches as mpatches
    import matplotlib.pyplot as plt
    colors = ["g", "w"]
    texts = ["Green Data Description", "RedData Description"]
    patches = [ plt.plot([],[], marker="o", ms=10, ls="", mec=None, color=colors[i], 
                label="{:s}".format(texts[i]) )[0]  for i in range(len(texts)) ]
    plt.legend(handles=patches, bbox_to_anchor=(0.5, 0.5), 
               loc='center', ncol=2, facecolor="plum", numpoints=1 )
    
    plt.show()
    

    (Note that mec and numpoints arguments are only required for older versions of matplotlib)

    For more complicated shapes in the legend, you may use a custom handler map, see the legend guide or e.g. this answer as an example

    0 讨论(0)
  • 2020-12-03 09:32

    Try this:

    import matplotlib.pyplot as plt
    import numpy as np
    import matplotlib.patches as mpatches
    from matplotlib.legend_handler import HandlerPatch
    colors = ["g", "w"]
    texts = ["Green Data Description", "RedData Description"]
    class HandlerEllipse(HandlerPatch):
        def create_artists(self, legend, orig_handle,
                           xdescent, ydescent, width, height, fontsize, trans):
            center = 0.5 * width - 0.5 * xdescent, 0.5 * height - 0.5 * ydescent
            p = mpatches.Ellipse(xy=center, width=width + xdescent,
                                 height=height + ydescent)
            self.update_prop(p, orig_handle, legend)
            p.set_transform(trans)
            return [p]
    
    
    c = [ mpatches.Circle((0.5, 0.5), 1, facecolor=colors[i], linewidth=3) for i in range(len(texts))]
    plt.legend(c,texts,bbox_to_anchor=(0.5, 0.5), loc='center', ncol=2, handler_map={mpatches.Circle: HandlerEllipse()}).get_frame().set_facecolor('#00FFCC')
    plt.show()
    

    output:

    Update:

    To circle, set width equals to height, in mpatches.Ellipse

    Remove the outer black line, set edgecolor="none" in mpatches.Circle

    code:

    import matplotlib.pyplot as plt
    import numpy as np
    import matplotlib.patches as mpatches
    from matplotlib.legend_handler import HandlerPatch
    colors = ["g", "w"]
    texts = ["Green Data Description", "RedData Description"]
    class HandlerEllipse(HandlerPatch):
        def create_artists(self, legend, orig_handle,
                           xdescent, ydescent, width, height, fontsize, trans):
            center = 0.5 * width - 0.5 * xdescent, 0.5 * height - 0.5 * ydescent
            p = mpatches.Ellipse(xy=center, width=height + xdescent,
                                 height=height + ydescent)
            self.update_prop(p, orig_handle, legend)
            p.set_transform(trans)
            return [p]
    
    
    c = [ mpatches.Circle((0.5, 0.5), radius = 0.25, facecolor=colors[i], edgecolor="none" ) for i in range(len(texts))]
    plt.legend(c,texts,bbox_to_anchor=(0.5, 0.5), loc='center', ncol=2, handler_map={mpatches.Circle: HandlerEllipse()}).get_frame().set_facecolor('#00FFCC')
    plt.show()
    

    New Picture:

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