2015-10-08 17 views
7

I olan aşağıdaki panda DataFrame ("A" son sütun başlığı olup, diğer sütunlar, bir araya getirilen hiyerarşik indeksi):hiyerarşik pasta/halka grafik bokeh veya Matplotlib kullanılarak

A 
kingdom  phylum   class    order    family      genus    species    
No blast hit                               2496 
k__Archaea p__Euryarchaeota c__Thermoplasmata o__E2    f__[Methanomassiliicoccaceae] g__vadinCA11  s__    6 
k__Bacteria p__    c__    o__     f__       g__    s__    5 
      p__Actinobacteria c__Acidimicrobiia o__Acidimicrobiales f__       g__    s__    0 
           c__Actinobacteria o__Actinomycetales f__Corynebacteriaceae   g__Corynebacterium s__stationis  2 
                     f__Micrococcaceae    g__Arthrobacter s__    8 
               o__Bifidobacteriales f__Bifidobacteriaceae   g__Bifidobacterium s__    506 
                                 s__animalis  48 
           c__Coriobacteriia o__Coriobacteriales f__Coriobacteriaceae   g__    s__    734 
                            g__Collinsella  s__aerofaciens  3 

(verilerle bir CSV kullanılabilir here)

Her bir eşmerkezli çemberin bir seviye (krallık, filum vb.) olduğu ve A sütununun toplamına göre bölünmüş olduğu bir pasta/çörek çizelgesinde çizmek istiyorum Bu seviye için, buna benzer bir şeyle bitiriyorum, ancak verilerimle:

disk usage chart

Ben matplotlib ve bokeh içine baktım ama şimdiye kadar bulduğum en benzer şey daha tahmin etmek nasıl bilmiyorum, hangi kaldırılmış grafiği kullanarak, boke Halka grafik örneğidir 2 seviye daha.

+0

Merhaba, bir: layered pie chart random data

gerçek verilerde bu gibi görünüyor pythonic cevap, ama bunu yapmak için çok güzel bir perl programı ilginizi çekebilir, piechart interaktif (alt kategorilerde yakınlaştırma yapabilirsiniz), _Krona Tools_ denir: [https://github.com/marbl/Krona /wiki](https://github.com/marbl/Krona/wiki). Ayrıca, gördüğünüz gibi MetaPhlAn ve takson bolluğu üzerinde çalışıyorsanız, MetaPhlAn yürütme ve aşağı akış analizlerini (Krona grafikleri dahil olmak üzere) otomatikleştiren boru hattım _metaBIT_'ı isteyebilirsiniz: [https://bitbucket.org/Glouvel/metabit] (https://bitbucket.org/Glouvel/metabit) – PlasmaBinturong

cevap

7

Bunu önceden tanımlanmış herhangi bir şey olup olmadığını bilmiyorum, ancak groupby ve çakışan pasta grafiklerini kullanarak kendi oluşturmak mümkündür. Verilerinizi almak ve en azından belirttiğiniz şeye benzer bir şey almak için aşağıdaki komut dosyasını oluşturdum.

Grup çağı çağrılarının (her bir seviyedeki toplamları hesaplamak için kullanılan), düzgün bir şekilde hizalanabilmesi için sıralamaların kapalı olması gerektiğini unutmayın. Veri kümeniz aynı zamanda çok üniform değil, bu yüzden sonuç tablosu için biraz rastgele veri oluşturdum.

Muhtemelen renkleri ve etiket konumlarını ayarlamalısınız, ancak bu bir başlangıç ​​olabilir.

import pandas as pd 
import matplotlib.pyplot as plt 
import numpy as np 

df = pd.read_csv('species.csv') 
df = df.dropna() # Drop the "no hits" line 
df['A'] = np.random.rand(len(df)) * 100 + 1 

# Do the summing to get the values for each layer 
def nested_pie(df): 

    cols = df.columns.tolist() 
    outd = {} 
    gb = df.groupby(cols[0], sort=False).sum() 
    outd[0] = {'names':gb.index.values, 'values':gb.values} 
    for lev in range(1,7): 
     gb = df.groupby(cols[:(lev+1)], sort=False).sum() 
     outd[lev] = {'names':gb.index.levels[lev][gb.index.labels[lev]].tolist(), 
        'values':gb.values} 
    return outd 

outd = nested_pie(df) 
diff = 1/7.0 

# This first pie chart fill the plot, it's the lowest level 
plt.pie(outd[6]['values'], labels=outd[6]['names'], labeldistance=0.9, 
     colors=plt.style.library['bmh']['axes.color_cycle']) 
ax = plt.gca() 
# For each successive plot, change the max radius so that they overlay 
for i in np.arange(5,-1,-1): 
    ax.pie(outd[i]['values'], labels=outd[i]['names'], 
      radius=np.float(i+1)/7.0, labeldistance=((2*(i+1)-1)/14.0)/((i+1)/7.0), 
      colors=plt.style.library['bmh']['axes.color_cycle']) 
ax.set_aspect('equal') 

Modülo random() için çağrısından hafif değişiklikler, bu böyle bir arsa verir:

layered pie chart user data