2015-10-08 6 views
7

をmatplotlibのIは、以下パンダデータフレーム(「A」は、最後の列のヘッダーであり;残りの列は、結合階層インデックスである)を有する:ボケを用いパンダDATAFRAMEから階層的パイ/ドーナツチャートまたは

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 

(データを持つCSVが利用可能ですhere

各同心円がレベル(王国、門など)であり、列Aの合計に従って分割されている円/ドーナッツチャートでプロットしたいそのレベルのために、私はこれに似た何かで終わるが、私のデータを持つ:

disk usage chart

私はmatplotlibのとボケに見てきたが、私はこれまでに見つかった最も類似したものは、私はより多くのために推定する方法がわからないこれは、非推奨のチャートを用いて、ボケドーナツグラフの例であります2レベル以上。

+0

こんにちは、ありませんニシキヘビの答えが、あなたはそれを行うには非常に良いperlのプログラムに興味があるかもしれない、円グラフは、(あなたは、サブカテゴリにズームインすることができます)、インタラクティブであり、それは_Krona Tools_と呼ばれています:[https://github.com/marbl/Krona /wiki](https://github.com/marbl/Krona/wiki)。また 、私はあなたがMetaPhlAnと分類群の存在量に関する作業している見るように、あなたは自動化私のパイプライン_metaBIT_を好むかもしれないMetaPhlAnの実行と(クローナチャートを作る含む)ダウンストリームの分析:[https://bitbucket.org/Glouvel/metabit] (https://bitbucket.org/Glouvel/metabit) – PlasmaBinturong

答えて

7

何がこれを行うことが事前に定義されている場合、私は知りませんが、それはあなた自身のGROUPBYを使用して重複円プロットを構築することが可能です。私はあなたのデータを取って、あなたが指定したものと少なくとも類似したものを得るために次のスクリプトを作った。 (各レベルの合計を計算するために使用されている)GROUPBYコールが正しく並ぶように、物事のためにオフにソートしておく必要があります

注意。あなたのデータセットも非常に不均一なので、私はちょうど図表のために少し結果のグラフを広げるためにいくつかのランダムなデータを作った。

おそらく、色やラベルの位置を微調整する必要がありますが、それはスタートかもしれません。

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

コールからrandom()にモデューロわずかな変化、これはこのようなプロットが得られます。 layered pie chart random data

あなたの実際のデータに、それは次のようになります。

layered pie chart user data

関連する問題