📅  最后修改于: 2023-12-03 15:17:35.607000             🧑  作者: Mango
如果你经常使用 Matplotlib 绘制饼图,你可能会发现标签经常会重叠在一起,使图表难以阅读。在本教程中,我们将介绍如何使用 Python 和 Matplotlib 创建饼图,并使用自动文本移动来避免标签重叠问题。
import matplotlib.pyplot as plt
首先,我们需要创建一个简单的饼图。下面是一个例子:
sizes = [30, 40, 20, 10]
labels = ['A', 'B', 'C', 'D']
plt.pie(sizes, labels=labels)
plt.show()
结果将是一个简单的饼图,每个片的大小由变量 sizes
定义,标签由变量 labels
定义。
现在,让我们尝试解决标签重叠问题。为了移动标签,我们需要将 pie()
函数的 autopct
参数设置为一个格式化字符串。该字符串将返回一个包含标签名称和百分比的字符串。
我们还需要创建一个函数来检查标签位置是否重叠,并在需要时移动它们。下面是完整的代码:
def check_overlap(x1,y1,w1,h1, x2,y2,w2,h2):
if (x1+w1<x2 or x2+w2<x1 or y1+h1<y2 or y2+h2<y1):
return False
else:
return True
def move_labels(patches, labels):
for i in range(len(patches)):
patch = patches[i]
label = labels[i]
x, y = label.get_position()
w, h = label.get_size()
angle = patch.angle
x1 = x - 0.5 * w
y1 = y - 0.5 * h
x2 = x1 + w
y2 = y1 + h
for j in range(i):
other_patch = patches[j]
other_label = labels[j]
other_x, other_y = other_label.get_position()
other_w, other_h = other_label.get_size()
other_angle = other_patch.angle
other_x1 = other_x - 0.5 * other_w
other_y1 = other_y - 0.5 * other_h
other_x2 = other_x1 + other_w
other_y2 = other_y1 + other_h
if check_overlap(x1, y1, w, h, other_x1, other_y1, other_w, other_h):
d = 0.5 * (h + other_h)
if y > other_y:
label.set_position((x + d *
np.sin(np.radians(angle)), y - d * np.cos(np.radians(angle))))
else:
label.set_position((x - d *
np.sin(np.radians(angle)), y + d * np.cos(np.radians(angle))))
# create data
sizes = [30, 40, 20, 10]
labels = ['A', 'B', 'C', 'D']
# create pie chart
patches, texts, autotexts = plt.pie(sizes, labels=labels, autopct='%1.1f%%')
move_labels(patches, texts)
# show chart
plt.show()
该函数会从所有标签中遍历两次,并检查它们是否重叠。如果标签重叠,它将计算方向和移动距离,然后使用 set_position()
函数将其移动到新位置。
现在你可以运行代码并查看结果。你将看到标签已经移动,饼图变得更加易于阅读。
这就是移动自动文本来避免饼图标签重叠问题的全部过程。现在你已经掌握了使用 Python 和 Matplotlib 创建和编辑饼图的基本技巧。