2016-12-01 23 views
1

%年齢の値を持つ円グラフをプロットする必要があります。matplotlibを使用してプロットすると、値が非常に小さく、それらの% Python、therirラベルoverlabと読み取り可能ではありません。私はここに私の単純なコード円プロットで0%のキーを避ける方法matplotlib

def show_pi_chart(plot_title,keys,values,save_file): 
    size = len(keys) 
    #Get Colors list 
    color_list = make_color_list(size) 
    pyplot.axis("equal") 
    pyplot.pie(values, 
       labels=keys, 
       colors=color_list, 
       autopct="%1.1f%%" 
       ) 
    pyplot.title(plot_title) 
    pyplot.show() 

ですそして、私のチャートは enter image description here

あるその一つの解がゼロ%の年齢と第二との値を避けるためである(いくつかの矢印などで)重なるようにラベルをseprateしていると思います意図したとおりに以下のコードをラベルがdictant作るか、または小さな%の年齢キー

+1

円グラフは悪いと言えますか? – percusse

+0

礼拝よりも簡単な質問をする方が良い – Shafiq

答えて

1

を除去するためのソリューションが動作するはずです:

from matplotlib import pyplot 
from collections import Counter 
import numpy as np 

def fixOverLappingText(text): 

    # if undetected overlaps reduce sigFigures to 1 
    sigFigures = 2 
    positions = [(round(item.get_position()[1],sigFigures), item) for item in text] 

    overLapping = Counter((item[0] for item in positions)) 
    overLapping = [key for key, value in overLapping.items() if value >= 2] 

    for key in overLapping: 
     textObjects = [text for position, text in positions if position == key] 

     if textObjects: 

      # If bigger font size scale will need increasing 
      scale = 0.05 

      spacings = np.linspace(0,scale*len(textObjects),len(textObjects)) 

      for shift, textObject in zip(spacings,textObjects): 
       textObject.set_y(key + shift) 


def show_pi_chart(plot_title,keys,values): 

    pyplot.axis("equal") 

    # make sure to assign text variable to index [1] of return values 
    text = pyplot.pie(values, labels=keys, autopct="%1.1f%%")[1] 

    fixOverLappingText(text) 
    pyplot.title(plot_title) 

    pyplot.show() 


show_pi_chart("TITLE",("One","Two","Three","Four","Five","Six","Seven", "Eight"),(20,0,0,10,44,0,0,44)) 

enter image description here

関連する問題