Странная круговая диаграмма отрезана - PullRequest
0 голосов
/ 15 мая 2018

Я создаю датчик, используя пирог matplotlib в качестве основы:

import matplotlib.pyplot as plt
import math    

theta = 0.2

group_size=[10,10,10,10,10,50]

mid = [18,54,90,126,162]

from textwrap import wrap
labels=['1','2','3','4','5','']
labels = [ '\n'.join(wrap(l, 9)) for l in labels ]

fig, ax = plt.subplots()

ax.axis('equal')
pie3 = ax.pie(group_size, radius=2.2, colors=['k'] ,startangle=180,counterclock=False)

my_circle=plt.Circle( (0,0), 0.4, color='white')
p=plt.gcf()
p.gca().add_artist(my_circle)

pie4 = ax.pie([10,10,10,10,10,50], radius=2,  labeldistance=0.9, labels=labels,
              startangle=180,rotatelabels =True,counterclock=False)

plt.setp(pie4[1], rotation_mode="anchor", ha="center", va="center")
for tx in pie4[1]:
    font = tx.get_fontsize()
    tx.set_fontsize(12)
    rot = tx.get_rotation()
    tx.set_rotation(rot+90+(1-rot//180)*180)

for pie_wedge in pie3[0]:
    pie_wedge.set_edgecolor('white')

for pie_wedge in pie4[0]:
    pie_wedge.set_edgecolor('white')
    pie_wedge.set_linewidth(4)

#arrow bottom circle
ax.add_patch(Circle((0, 0), radius=0.15, facecolor='k',zorder=12))
ax.add_patch(Circle((0, 0), radius=0.13, facecolor='w',zorder=13))

ax.arrow(0, 0, 1.7 * np.sin(math.radians(theta*180-90)), 1.7 * np.cos(math.radians(theta*180-90)), \
                 width=0.15, head_width=0.15, head_length=0.2, fc='k', ec='k')

theta2 = 0.45

ax.arrow(0, 0, 1.7 * np.sin(math.radians(theta2*180-90)), 1.7 * np.cos(math.radians(theta2*180-90)), \
                 width=0.15, head_width=0.15, head_length=0.2, fc='k', ec='k',zorder=20)

Теперь проблема в том, что моя стрелка датчика (красная), кажется, обрезается сверху, если она находится между 2и 4. Почти как будто существует воображаемая линия между левым углом 2-го клина и правым углом 4-го клина.Как вы можете видеть с черной стрелкой, никаких проблем нет.

enter image description here

Кто-нибудь знает, что здесь происходит?Я подозреваю возможную проблему с фигой?

1 Ответ

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

Я думаю, что вы в основном правы, полагая, что это проблема размера или, по крайней мере, проблема размера кадра. Как только он у вас есть, вы строите круговую диаграмму за границами фигуры (эта граница является «воображаемой линией», о которой вы говорите в своем вопросе). Стрелки не знают, как с этим справиться, и их просто обрезают там, где будет рама. Одним из способов решения этой проблемы является построение круговой диаграммы с радиусом 1 (вместо 2, как у вас было), чтобы он находился в пределах рамки matplotlib, а затем просто разделите длины стрелок и другие стрелки. параметры на 2 или около того, чтобы масштабировать все соответственно. Вот в основном то, что я сделал, чтобы изменить ваш код, чтобы вы начали (я добавил комментарии в #### CAPS LOCK ####, где я что-то изменил):

from matplotlib.patches import Circle
import matplotlib.pyplot as plt
import math    

theta = 0.2

group_size=[10,10,10,10,10,50]

mid = [18,54,90,126,162]

from textwrap import wrap
labels=['1','2','3','4','5','']
labels = [ '\n'.join(wrap(l, 9)) for l in labels ]

fig, ax = plt.subplots()

ax.axis('equal')
### CHANGED RADIUS HERE ###
pie3 = ax.pie(group_size,radius=1, colors=['k'] ,startangle=180,counterclock=False)

my_circle=plt.Circle( (0,0), 0.4, color='white')
p=plt.gcf()
p.gca().add_artist(my_circle)

### CHANGED RADIUS HERE ###
pie4 = ax.pie([10,10,10,10,10,50], radius=0.9,  labeldistance=0.85, labels=labels,
              startangle=180,rotatelabels =True,counterclock=False)

plt.setp(pie4[1], rotation_mode="anchor", ha="center", va="center")
for tx in pie4[1]:
    font = tx.get_fontsize()
    tx.set_fontsize(12)
    rot = tx.get_rotation()
    tx.set_rotation(rot+90+(1-rot//180)*180)

for pie_wedge in pie3[0]:
    pie_wedge.set_edgecolor('white')

### DIVIDED LINEWIDTH BY 2 FOR SCALING ###
for pie_wedge in pie4[0]:
    pie_wedge.set_edgecolor('white')
    pie_wedge.set_linewidth(2)

#arrow bottom circle
### DIVIDED RADIUS BY 2 FOR SCALING ###
ax.add_patch(Circle((0, 0), radius=0.15/2, facecolor='k',zorder=12))
ax.add_patch(Circle((0, 0), radius=0.13/2, facecolor='w',zorder=13))

### DIVIDED SOME PARAMETERS BY 2.2 FOR SCALING ####
ax.arrow(0, 0, 1.7/2.2 * np.sin(math.radians(theta*180-90)), 1.7/2.2 * np.cos(math.radians(theta*180-90)), \
                 width=0.15/2, head_width=0.15/2, head_length=0.2/2, fc='k', ec='k')

theta2 = 0.45

### DIVIDED SOME PARAMETERS BY 2.2 FOR SCALING ####
ax.arrow(0, 0, 1.7/2.2 * np.sin(math.radians(theta2*180-90)), 1.7/2.2 * np.cos(math.radians(theta2*180-90)), \
                 width=0.15/2, head_width=0.15/2, head_length=0.2/2, fc='k', ec='k')

#### TIGHT LAYOUT MAKES SENSE HERE ####
plt.tight_layout()

enter image description here

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