Условное перемещение позиции отдельной метки данных на графике ap ie - PullRequest
0 голосов
/ 14 февраля 2020

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

import matplotlib.pyplot as plt
%matplotlib inline

# Following should supposedly set the font correctly:
plt.rcParams['font.family'] = 'sans-serif'
plt.rcParams['font.sans-serif'] = ['Muli'] + plt.rcParams['font.sans-serif']
plt.rcParams['font.weight'] = 'extra bold'

size_of_groups=[12,11,30,0.3]

colors = ['#a1daaa','#bbbbb4','#444511','#1afff2']

import matplotlib as mpl
mpl.rcParams['text.color'] = '#273859'

# Create a pieplot
my_pie,texts,_ = plt.pie(size_of_groups,radius = 1.2,colors=colors,autopct="%.1f%%",
textprops = {'color':'w',                                                                                           
             'size':15  #, 'weight':"extra bold"
            }, pctdistance=0.75, labeldistance=0.7) #pctdistance and labeldistance change label positions.
labels=['High','Low','Normal','NA']
plt.legend(my_pie,labels,loc='lower center',ncol=2,bbox_to_anchor=(0.5, -0.2))
plt.setp(my_pie, width=0.6, edgecolor='white') 
fig1 = plt.gcf()
fig1.show()

Вышеприведенное выводит следующее:

img

В основном , это замечательно. Наконец-то я получил симпатичную кольцевую диаграмму!

Но есть еще одна вещь, которую нужно уловить - когда часть кольцевой диаграммы очень мала (например, 0,6%), мне нужно убрать этикетки диаграммы, и, возможно, окрашены в черный цвет вместо этого.

Мне удалось сделать что-то похожее для гистограмм, используя plt.text, но я не думаю, что это будет возможно с диаграммами p ie вообще. Я полагаю, что кто-то определенно уже решал подобную проблему раньше, но я не могу с готовностью найти подходящее решение.

Ответы [ 2 ]

1 голос
/ 14 февраля 2020

Я попытался найти решение, настроив решение ImportanceOfBeingErnest на другую проблему, указанную здесь . По какой-то причине знак процента не отображается в моей системе, но вы можете выяснить это

rad = 1.2 # Define a radius variable for later use

my_pie, texts, autotexts = plt.pie(size_of_groups, radius=rad, colors=colors, autopct="%.1f%%",
                     pctdistance=0.75, labeldistance=0.7, textprops={'color':'white', 'size':20}) 

# Rest of the code

cx, cy = 0, 0 # Center of the pie chart 

for t in autotexts:
    x, y = t.get_position()
    text = t.get_text()

    if float(text.strip('%')) < 1: # Here 1 is the target threshold percentage
        angle = np.arctan2(y-cy, x-cx)
        xt, yt = 1.1*rad*np.cos(angle)+cx, 1.1*rad*np.sin(angle)+cy
        t.set_color("k")
        t.set_position((xt,yt))      

enter image description here

1 голос
/ 14 февраля 2020

Вот способ переместить все процентные тексты для патчей, меньших некоторого заданного количества (5 градусов в примере кода). Обратите внимание, что это также не удастся, если рядом будет несколько маленьких кусочков.

import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np

size_of_groups = [12, 11, 30, 0.3]
colors = ['#a1daaa', '#bbbbb4', '#444511', '#1afff2']
my_pie, texts, pct_txts = plt.pie(size_of_groups, radius=1.2, colors=colors, autopct="%.1f%%",
                                  textprops={'color': 'w', 'size': 15}, pctdistance=0.75,
                                  labeldistance=0.7)
labels = ['High', 'Low', 'Normal', 'NA']
plt.legend(my_pie, labels, loc='lower center', ncol=2, bbox_to_anchor=(0.5, -0.2))
plt.setp(my_pie, width=0.6, edgecolor='white')

for patch, txt in zip(my_pie, pct_txts):
    if (patch.theta2 - patch.theta1) <= 5:
        # the angle at which the text is normally located
        angle = (patch.theta2 + patch.theta1) / 2.
        # new distance to the pie center
        x = patch.r * 1.2 * np.cos(angle * np.pi / 180)
        y = patch.r * 1.2 * np.sin(angle * np.pi / 180)
        # move text to new position
        txt.set_position((x, y))
        txt.set_color('black')
plt.tight_layout()
plt.show()

resulting pie

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...