📜  matplotlib 饼图移动自动文本 - Python (1)

📅  最后修改于: 2023-12-03 15:17:35.607000             🧑  作者: Mango

Matplotlib 饼图移动自动文本 - Python

如果你经常使用 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 创建和编辑饼图的基本技巧。