2015-10-08 19 views
7

Tôi có gấu trúc DataFrame sau ("A" là tiêu đề cột cuối cùng của; phần còn lại của cột là một chỉ số thứ bậc kết hợp):thứ bậc Biểu đồ hình tròn/donut từ Pandas DataFrame sử dụng bokeh hay Matplotlib

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 có dữ liệu có sẵn here)

Tôi muốn vẽ biểu đồ tròn/bánh rán, trong đó mỗi vòng tròn đồng tâm là một cấp (vương quốc, phylum, v.v ...) và được chia theo tổng của cột A cho cấp đó, vì vậy tôi kết thúc với một cái gì đó tương tự như vậy, nhưng với dữ liệu của tôi:

disk usage chart

Tôi đã xem xét matplotlib và bokeh, nhưng điều tương tự nhất mà tôi đã tìm thấy cho đến nay là biểu đồ Bo mạch chủ Donut, sử dụng biểu đồ không được chấp nhận, mà tôi không biết cách ngoại suy hơn 2 cấp độ.

+0

Hi, không phải là một câu trả lời pythonic, nhưng bạn có thể quan tâm đến một chương trình perl rất tốt để làm điều đó, nơi piechart là tương tác (bạn có thể phóng to trong tiểu thể loại), nó được gọi là _Krona Tools_: [https://github.com/marbl/Krona /wiki](https://github.com/marbl/Krona/wiki). Ngoài ra, như tôi thấy bạn là MetaPhlAn và làm việc trên sự phong phú của taxon, bạn có thể thích đường dẫn _metaBIT_ của tôi tự động hóa việc thực hiện MetaPhlAn và phân tích luồng xuống (bao gồm tạo biểu đồ Krona): [https://bitbucket.org/Glouvel/metabit] (https://bitbucket.org/Glouvel/metabit) – PlasmaBinturong

Trả lời

7

Tôi không biết nếu có bất kỳ điều gì được xác định trước nhưng thực hiện điều này, nhưng bạn có thể tự xây dựng bằng cách sử dụng ô nhóm và ô xếp chồng lên nhau. Tôi đã xây dựng kịch bản sau đây để lấy dữ liệu của bạn và nhận được một cái gì đó ít nhất là tương tự như những gì bạn chỉ định.

Lưu ý rằng các cuộc gọi nhóm (được sử dụng để tính tổng số ở mỗi cấp) phải được sắp xếp tắt để mọi thứ xếp hàng chính xác. Tập dữ liệu của bạn cũng rất không thống nhất, vì vậy tôi chỉ thực hiện một số dữ liệu ngẫu nhiên để trải ra biểu đồ kết quả một chút vì mục đích minh họa.

Có thể bạn sẽ phải tinh chỉnh màu sắc và vị trí nhãn, nhưng nó có thể là một sự khởi đầu.

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

Modulo thay đổi nhỏ từ cuộc gọi đến random(), điều này mang lại một âm mưu như thế này: layered pie chart random data

On dữ liệu thực sự của bạn nó trông như thế này:

layered pie chart user data

Các vấn đề liên quan