2014-05-10 6 views
9

Mein Python-Code ist:Wie vermeidet man Überlappungen von Labels & autopct in einem Matplotlib-Kreisdiagramm?

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

Ist es möglich, die Etiketten "Jan", "Februar", "Mar" zu zeigen, usw., und die Prozentsätze, entweder:

  • ohne Überlappung, oder
  • mit einem arrow mark?

piechart

Antwort

19

Alternativ können Sie die Legenden neben dem Kreisdiagramm setzen:

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: wenn Sie die Legende in der ursprünglichen Reihenfolge halten wollen , wie Sie in den Kommentaren erwähnt haben, können Sie sort_legend=False in den obigen Code setzen, geben Sie:

enter image description here

+0

Hallo @Saullo Castro, Dies ist möchte ich butone wollen mehr problemI die Legende in der Reihenfolge der Array wollen es ist .. das heißt, Jan, Feb, Mar, April, Mai, June..Oct, Nov., Dez. Hier ist es in der Reihenfolge der Daten (y-Werte) – user123

+0

@ user123 bitte, siehe die Bearbeitung oben, zeigt es, wie die Legende zu vermeiden, zu sortieren ... –

+2

Erstaunlich. Ich habe mit dieser Antwort eine Menge neuer Funktionen in Python gelernt. 10/10. – IMPERATOR

Verwandte Themen