Matplotlib Legend for Scatter avec des couleurs personnalisées
-
07-07-2019 - |
Question
Je suis un peu novice dans ce domaine et j'essaie de créer un tableau de dispersion avec des tailles et des couleurs de bulle personnalisées. Le graphique s’affiche correctement, mais comment puis-je obtenir une légende indiquant à quoi les couleurs se rapportent? C’est tout ce que j’ai:
inc = []
out = []
bal = []
col = []
fig=Figure()
ax=fig.add_subplot(111)
inc = (30000,20000,70000)
out = (80000,30000,40000)
bal = (12000,10000,6000)
col = (1,2,3)
leg = ('proj1','proj2','proj3')
ax.scatter(inc, out, s=bal, c=col)
ax.axis([0, 100000, 0, 100000])
ax.set_xlabel('income', fontsize=20)
ax.set_ylabel('Expenditure', fontsize=20)
ax.set_title('Project FInancial Positions %s' % dt)
ax.grid(True)
canvas=FigureCanvas(fig)
response=HttpResponse(content_type='image/png')
canvas.print_png(response)
Ce fil de discussion a été utile mais n'a pas permis de résoudre mon problème: Matplotlib: Légende ne s'affiche pas correctement
La solution
Peut-être que cet exemple est utile.
En général, les éléments de la légende sont associés à une sorte d’objet tracé (tracé) . La fonction / méthode scatter
traite tous les cercles comme un seul objet, voir:
print type(ax.scatter(...))
La solution consiste donc à créer plusieurs objets. Par conséquent, en appelant scatter
plusieurs fois.
Malheureusement, la nouvelle version de matplotlib ne semble pas utiliser de rectangle dans la légende. Ainsi, la légende contiendra de très grands cercles, car vous avez augmenté la taille de vos objets du diagramme de dispersion.
La légende fonctionne comme un argument de mot clé markerscale
pour contrôler la taille des marqueurs de légende, mais il semble être cassé.
Mise à jour:
Le guide de légende recommande d'utiliser Artiste proxy dans des cas similaires. La API Color explique les valeurs fc
valides.
p1 = Rectangle((0, 0), 1, 1, fc="b")
p2 = Rectangle((0, 0), 1, 1, fc="g")
p3 = Rectangle((0, 0), 1, 1, fc="r")
legend((p1, p2, p3), ('proj1','proj2','proj3'))
Pour obtenir les couleurs utilisées précédemment dans un tracé, utilisez l'exemple ci-dessus tel que:
pl1, = plot(x1, y1, '.', alpha=0.1, label='plot1')
pl2, = plot(x2, y2, '.', alpha=0.1, label='plot2')
p1 = Rectangle((0, 0), 1, 1, fc=pl1.get_color())
p2 = Rectangle((0, 0), 1, 1, fc=pl2.get_color())
legend((p1, p2), (pl1.get_label(), pl2.get_label()), loc='best')
Cet exemple créera un graphique tel que:
Autres conseils
Jetez un coup d'œil à ceci:
http://matplotlib.sourceforge.net/api/pyplot_api .html # matplotlib.pyplot.legend
J'espère que ça aide. Sinon, demandez simplement plus:)