2017-05-21 1 views
1

J'utilise le code suivant pour créer une légende matplotlib personnalisée.en utilisant mpatches.Patch pour une légende personnalisée

import matplotlib.patches as mpatches 
import matplotlib.pyplot as plt 
colors = ["g", "w"] 
texts = ["Green Data Description", "RedData Description"] 
patches = [ mpatches.Patch(color=colors[i], label="{:s}".format(texts[i])) for i in range(len(texts)) ] 
plt.legend(handles=patches, bbox_to_anchor=(0.5, 0.5), loc='center', ncol=2) 

La légende a donné lieu est la suivante:

enter image description here

1 - Le symbole blanc dans la légende n'est pas représentée parce que l'arrière-plan de la légende par défaut est blanc aussi bien. Comment puis-je définir l'arrière-plan de la légende à une autre couleur?

2 - Comment changer les symboles rectangulaires de la légende en forme circulaire?

Répondre

2
  1. réglage peut être effectué couleur d'arrière-plan de la légende en utilisant la facecolor argument à plt.legend(),

    plt.legend(facecolor="plum") 
    
  2. Pour obtenir une poignée de légende de forme circulaire, vous pouvez utiliser un tracé standard avec un marqueur circulaire artiste proxy,

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

Exemple complet:

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() 

(Notez que les arguments mec et numpoints ne sont requis que pour les anciennes versions de mat plotlib)

enter image description here

Pour les formes plus compliquées dans la légende, vous pouvez utiliser une carte de gestionnaire personnalisé, voir le legend guide ou par exemple this answer comme exemple

4

Essayez ceci:

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() 

sortie:

enter image description here

Mise à jour:

Pour cercle, largeur égale à la hauteur fixé, dans mpatches.Ellipse

Retirez la ligne noire extérieure, mis edgecolor="none" dans 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() 

Nouvelle Photo:

enter image description here

+0

Thant est exactement ce dont j'avais besoin. Je vous remercie. Mais comment éditer les dimensions de l'ellipse pour en faire un cercle? Comment enlever son contour noir externe? –

+0

@HeshamEraqi vérifier la réponse mise à jour. –