2015-12-02 3 views
3

У меня есть следующий код:Условное удаление ярлыков в Matplotlib круговой диаграммы

import matplotlib.pyplot as plt 
import numpy as np 
np.random.seed(123456) 
import pandas as pd 

df = pd.DataFrame(3 * np.random.rand(4, 4), index=['a', 'b', 'c', 'd'], 
        columns=['x', 'y','z','w']) 

plt.style.use('ggplot') 
colors = plt.rcParams['axes.color_cycle'] 

fig, axes = plt.subplots(nrows=2, ncols=3) 
for ax in axes.flat: 
    ax.axis('off') 

for ax, col in zip(axes.flat, df.columns): 
    ax.pie(df[col], labels=df.index, autopct='%.2f', colors=colors) 
    ax.set(ylabel='', title=col, aspect='equal') 

axes[0, 0].legend(bbox_to_anchor=(0, 0.5)) 

fig.savefig('your_file.png') # Or whichever format you'd like 
plt.show() 

которые производят следующим образом:

enter image description here

Мой вопрос, как я могу удалить ярлык на основе состояние. Например, я бы хотел показывать только метки с процентами> 20%. Такой, что этикетки и ценность a,c,d не будут отображаться в Х и т.д.

ответ

7

autopct аргумента от pie может быть вызываемым, который будет получить текущий процент. Таким образом, вам нужно будет предоставить функцию, которая возвращает пустую строку для значений, которые вы хотите опустить.

def my_autopct(pct): 
    return ('%.2f' % pct) if pct > 20 else '' 

ax.pie(df[col], labels=df.index, autopct=my_autopct, colors=colors) 

Если вам нужно Параметризуем значение на autopct аргумента, вам нужна функция, которая возвращает функцию, как:

def autopct_generator(limit): 
    def inner_autopct(pct): 
     return ('%.2f' % pct) if pct > limit else '' 
    return inner_autopct 

ax.pie(df[col], labels=df.index, autopct=autopct_generator(20), colors=colors) 

Для лейблов, самое лучшее, что я могу придумать с использует список понимание:

for ax, col in zip(axes.flat, df.columns):                
    data = df[col]                      
    labels = [n if v > data.sum() * 0.2 else '' 
       for n, v in zip(df.index, data)]      

    ax.pie(data, autopct=my_autopct, colors=colors, labels=labels) 

Заметим, однако, что легенда по умолчанию генерируется из первых переданных меток, так что вам нужно передать все значения в явном виде, чтобы сохранить его неповрежденными.

axes[0, 0].legend(df.index, bbox_to_anchor=(0, 0.5)) 
+0

Спасибо. Но я также хочу удалить соответствующие метки 'a, c, d'. – neversaint

+0

Как я могу это сделать? – neversaint

+1

@neversaint, я мало знаю о 'pandas', но это лучшее, что я могу придумать. – memoselyk

Смежные вопросы