web-dev-qa-db-fra.com

Comment éviter le chevauchement des étiquettes et de l'autopct dans un graphique à secteurs matplotlib?

Mon code Python est:

values = [234, 64, 54,10, 0, 1, 0, 9, 2, 1, 7, 7]
months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
          'Jul','Aug','Sep','Oct', 'Nov','Dec']

colors = ['yellowgreen', 'red', 'gold', 'lightskyblue', 
          'white','lightcoral','blue','pink', 'darkgreen', 
          'yellow','grey','Violet','Magenta','cyan']

plt.pie(values, labels=labels, autopct='%1.1f%%', shadow=True, 
        colors=colors, startangle=90, radius=1.2)

plt.show()

Est-il possible d'afficher les étiquettes "Jan", "Feb", "Mar", etc. et les pourcentages, soit:

  • sans chevauchement, ou
  • en utilisant un arrow mark?

piechart

19
user123

Vous pouvez également mettre les légendes à côté du graphique à secteurs:

import matplotlib.pyplot as plt
import numpy as np

x = np.char.array(['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct', 'Nov','Dec'])
y = np.array([234, 64, 54,10, 0, 1, 0, 9, 2, 1, 7, 7])
colors = ['yellowgreen','red','gold','lightskyblue','white','lightcoral','blue','pink', 'darkgreen','yellow','grey','Violet','Magenta','cyan']
porcent = 100.*y/y.sum()

patches, texts = plt.pie(y, colors=colors, startangle=90, radius=1.2)
labels = ['{0} - {1:1.2f} %'.format(i,j) for i,j in Zip(x, porcent)]

sort_legend = True
if sort_legend:
    patches, labels, dummy =  Zip(*sorted(Zip(patches, labels, y),
                                          key=lambda x: x[2],
                                          reverse=True))

plt.legend(patches, labels, loc='left center', bbox_to_anchor=(-0.1, 1.),
           fontsize=8)

plt.savefig('piechart.png', bbox_inches='tight')

enter image description here


EDIT: si vous souhaitez conserver la légende dans l'ordre d'origine, comme vous l'avez mentionné dans les commentaires, vous pouvez définir sort_legend=False dans le code ci-dessus, donnant:

enter image description here

31

Essayez l'étalement.

plt.tight_layout()

à la fin de votre code. Cela peut empêcher un peu le chevauchement.

0
real_aravind