2017-06-13 2 views
-2

Je trace une carte de densité à partir d'un fichier csv en utilisant histogram2D, contourf et matplotlib. S'il vous plaît jeter un oeil sur mon résultat: enter image description herePersonnalisez les intervalles d'une légende dans matplotlib

, ma demande principale est ho de personnaliser les intervalles de ma légende, je dois avoir seulement 5 intervalles avec un pas de 0,8 par exemple, et en matière de . l'intervalle> 2.5 je veux que ce soit juste sur l'intervalle avec la même couleur et étiquetés par "2.5 et plus est ici le code j'utilise pour personnaliser ma légende:

cmap = plt.cm.get_cmap('Paired', 8) 
cs = m.contourf(xi, yi, g, cmap = cmap) 
cbar = plt.colorbar(cs, orientation='horizontal') 
cbar.set_label('la densite des impacts foudre',size=18) 

# Set borders in the interval [0, 1] 
bound = np.linspace(0, 1, 9) 
# Preparing borders for the legend 
bound_prep = np.round(bound * 7, 2) 
# Creating 8 Patch instances 
plt.legend([mpatches.Patch(color=cmap(b)) for b in bound[:-1]], 
     ['{} - {}'.format(bound_prep[i], bound_prep[i+1] - 0.01) for i in range(8)], bbox_to_anchor=(1.05, 1), loc=2) 
plt.gcf().set_size_inches(15,15) 
plt.show() 

i besoin donc, fondamentalement, une légende similaire à celui-ci:

enter image description here

Des idées?

+0

J'ai du mal à comprendre le résultat souhaité. Vous dites que vous voulez avoir 5 intervalles, mais déjà dans le code vous avez 8 niveaux. Aussi, si l'intervalle est de 0,8, vous obtenez seulement 3 et un huitième d'intervalles jusqu'à 2,5. Comment les couleurs des intervalles devraient-elles se rapporter aux couleurs du tracé de contour? – ImportanceOfBeingErnest

+0

bien apparemment vous comprenez vraiment mon résultat désiré, alors oui j'ai 8 intervalles mais je dois gérer afin de garder seulement 6 ou 5 intervalles avec un pas inférieur à 0,8 bien sûr et les intervalles jusqu'à 2,5 devraient être en un intervalle résumé appelé 2.5 et ci-dessus et avec une couleur unique. –

Répondre

1

Je ne suis pas sûr, si je comprenais maintenant tout correctement. Pour moi, il serait logique d'utiliser exactement le même nombre de niveaux dans l'intrigue comme indiqué dans la légende.

Bien sûr, vous pouvez sélectionner les niveaux à utiliser manuellement via l'argument levels à contourf.

import matplotlib.pyplot as plt 
import numpy as np 

x= np.linspace(-3,3) 
X,Y = np.meshgrid(x,x) 
Z = np.exp(-(X**2+Y**2)) 

levels = [0,.1,.2,.3,.4,.5,1] 
cmap=plt.cm.get_cmap("Paired") 
colors=list(map(cmap, range(len(levels)))) 


fig,ax=plt.subplots() 
cf = ax.contourf(X,Y,Z, levels=levels, colors=colors) 
fig.colorbar(cf) 

handles = [plt.Rectangle((0,0),1,1, color=c) for c in colors] 
labels = [u"de {} à {}".format(levels[i], levels[i+1]) for i in range(len(levels)-1)] 
labels[-1] = "plus de {}".format(levels[-2]) 
ax.legend(handles, labels) 

plt.show() 

enter image description here

+0

ouais c'est ce que je cherchais, merci beaucoup pour votre aide! –