Я думаю, что вы в основном правы, полагая, что это проблема размера или, по крайней мере, проблема размера кадра. Как только он у вас есть, вы строите круговую диаграмму за границами фигуры (эта граница является «воображаемой линией», о которой вы говорите в своем вопросе). Стрелки не знают, как с этим справиться, и их просто обрезают там, где будет рама. Одним из способов решения этой проблемы является построение круговой диаграммы с радиусом 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](https://i.stack.imgur.com/5g6yc.png)