matplotlib: круговая диаграмма, переменная pctdistance - PullRequest
0 голосов
/ 30 мая 2018

Я хочу иметь возможность размещать каждое процентное значение на разном расстоянии от центра, но pctdistance должно быть одним значением.

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

import matplotlib.pyplot as plt

fig =plt.figure(figsize = (10,10))
ax11 = fig.add_subplot(111)
# Data to plot
labels = 'Python', 'C++', 'Ruby', 'Java'
sizes = [215, 130, 245, 2000]
colors = ['gold', 'yellowgreen', 'lightcoral', 'lightskyblue']
explode = (0.1, 0, 0, 0)  # explode 1st slice

# Plot
w,l,p = ax11.pie(sizes,  labels=labels, colors=colors,
        autopct='%1.1f%%', startangle=140, pctdistance=0.8, radius = 0.5)
[t.set_rotation(0) for t in p]
[t.set_fontsize(50) for t in p]
plt.axis('equal')
plt.show()

Что у меня есть: enter image description here Что я хочу: enter image description here

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Прежде чем попробовать что-то более сложное, стоит оптимизировать параметры сюжета.Вот что вы можете получить, выбрав соответствующий размер шрифта и расстояние до точки отсчета, включая разнесение:

import matplotlib.pyplot as plt

fig =plt.figure(figsize = (10,10))
ax11 = fig.add_subplot(111)
# Data to plot
sizes = [215, 130, 245, 2000]
labels = 'Python', 'C++', 'Ruby', 'Java'
colors = ['gold', 'yellowgreen', 'lightcoral', 'lightskyblue']
explode = (0.1, 0, 0, 0)  # explode 1st slice

# Plot
w,l,p = ax11.pie(sizes,  labels=labels, colors=colors,
        autopct='%1.1f%%', startangle=140, pctdistance=0.65, radius = 1, explode=explode)
[t.set_rotation(0) for t in p]
[t.set_fontsize(25) for t in p]
[t.set_fontsize(25) for t in l]
plt.axis('equal')
plt.show()

enter image description here

0 голосов
/ 30 мая 2018

Функция pie не принимает списки или массивы в качестве входных данных для аргумента pctdistance.

Вы можете расположить тексты вручную, используя предопределенный список pctdistances.

import numpy as np
import matplotlib.pyplot as plt

fig =plt.figure(figsize = (4,4))
ax11 = fig.add_subplot(111)
# Data to plot
labels = 'Python', 'C++', 'Ruby', 'Java'
sizes = [215, 130, 245, 2000]
colors = ['gold', 'yellowgreen', 'lightcoral', 'lightskyblue']

# Plot
w,l,p = ax11.pie(sizes,  labels=labels, colors=colors,
        autopct='%1.1f%%', startangle=140, pctdistance=1, radius = 0.5)

pctdists = [.8, .5, .4, .2]

for t,d in zip(p, pctdists):
    xi,yi = t.get_position()
    ri = np.sqrt(xi**2+yi**2)
    phi = np.arctan2(yi,xi)
    x = d*ri*np.cos(phi)
    y = d*ri*np.sin(phi)
    t.set_position((x,y))

plt.axis('equal')
plt.show()

enter image description here

...