Matplotlib 同时将多个饼状图切片分离
Matplotlib是一个用于创建静态、动态和交互式可视化图形的Python库,它能够生成各种类型的图表,其中包括饼状图。饼状图是一种将数据按照比例分成多个切片并在一个圆形中呈现其占比的图表类型。 但是,当做出多个切片非常相似的饼状图时,这很容易导致可视化的混淆,而matplotlib’s pie chart方法提供的explode参数可以帮助我们区分各个切片,本文将介绍如何使用explode参数同时切分多个饼状图。
阅读更多:Matplotlib 教程
在饼状图中分离多个切片
首先,我们可以使用Matplotlib生成一个基本饼状图,绘制方法如下:
import matplotlib.pyplot as plt
labels = ['Apple', 'Banana', 'Pear', 'Pineapple']
sizes = [20, 30, 15, 35]
fig1, ax1 = plt.subplots()
ax1.pie(sizes, labels=labels, autopct='%1.1f%%')
ax1.axis('equal')
plt.show()
为了区分这些水果的不同占比,我们需要切分饼状图。传入explode参数可以将某一或多个部分离开饼图,这可以通过将其对应的值从半径中间移开来实现。例如,如果我们想突出显示“Apple”这一部分,我们可以将其在数据中设置为较大的值,例如1,其他部分保持在原来的大小,如下所示:
explode = [0.1, 0, 0, 0]
ax1.pie(sizes, labels=labels, autopct='%1.1f%%', explode=explode)
在这个图表中,我们可以看到切出的“Apple”突出显示,凸显出其占比。与通常的饼状图不同,视觉上很容易区分这些切片,在绘图中使用多个explode参数也可以将一组相似的饼状图分开。
下面,我们尝试在同一个坐标系中绘制多个饼状图,以展示如何使用expand 参数和indices 参数对多个饼图进行切分。
在同一坐标系下绘制多个饼状图
要在同一坐标系下绘制多个切片并对它们进行分离,我们需要定义多个饼图的参数;为了展示清晰,我们可以使用不同的颜色进行区分。由于每个饼图的大小会影响能否分离出它们的命令参数,我们需要决定合适的系数为每个饼图计算最终的半径。
labels1 = ['England', 'Australia', 'India', 'South Africa']
labels2 = ['Lady Gaga', 'Adele', 'Beyonce']
sizes1 = [29, 23, 22, 26]
sizes2 = [31, 32, 37]
colors1 = ['#ff9999','#66b3ff','#99ff99','#ffcc99']
colors2 = ['#ffcc99','#99ff99','#66b3ff']
# 子图1
fig1, ax1 = plt.subplots()
ax1.pie(sizes1, colors=colors1, labels=labels1,
autopct='%1.1f%%', startangle=90, radius=1.2)
在绘制这个饼图之前,我们定义了两个颜色列表colors1和colors2。这些颜色会在后面的绘图中使用。
接下来,我们需要计算每个饼图的大小以及半径。
# 计算每个饼图的大小
total_size = sum(sizes1)
sizes1 = [size / total_size for size in sizes1]
total_size = sum(sizes2)
sizes2 = [size / total_size for size in sizes2]
# 计算每个饼图的半径
radius1 = 1.2
radius2 = radius1 * 2 / 3
使用total_size变量归一化每个饼图的sizes。接下来,根据两个半径的比例计算每个饼图的半径。
有了这些参数之后,我们就可以绘制出两个圆形了。ax1.pie函数可以通过添加参数来控制每个部分的位置和大小。expand参数控制切片之间的距离,而indices参数允许我们在每个半径上绘制具有不同位置的饼图。
# 绘制子图2
ax2 = ax1.twiny()
ax2.pie(sizes2, colors=colors2, startangle=90, radius=radius2,
autopct='%1.1f%%', pctdistance=0.85)
# 控制距离
wedgeprops = {'width': 0.3, 'edgecolor': 'w', 'linewidth': 1}
ax1.pie(sizes1, labels=labels1, colors=colors1,
autopct='%1.1f%%', startangle=90,
pctdistance=0.8, explode=[0.05, 0.02, 0.02, 0.02],
wedgeprops=wedgeprops, radius=radius1,
center=(0.35, 0), frame=True)
# 控制位置
ax2.pie(sizes2, colors=colors2,
startangle=90, pctdistance=0.8,
radius=radius2, frame=True, wedgeprops=wedgeprops,
explode=[0.02, 0.02, 0.02])
# 开始角度90度
ax2.set_xlabel('Singers', fontweight ='bold')
ax2.set_xticks([0.3, 0.8])
ax2.set_xticklabels(['Countries', ''])
ax2.xaxis.set_tick_params(labelsize=12)
ax2.set_frame_on(False)
ax1.axis('equal')
plt.show()
我们通过在每个半径上绘制不同大小的圆来区分每个圆的不同部分。 在这个图表中,我们可以看到两个不同的圆,一个代表了四个国家的股份比例,另一个代表了三位歌手的声誉榜单。 通过将圆环相对于其他大小整体增大或减小,可以很容易地看到数据的变化。
总结
在本文中,我们介绍了如何使用Matplotlib的饼图的explode参数制作带有切片的饼状图,并在同一坐标系下绘制多个切割的饼状图。 Matplotlib是一个灵活的可视化工具,它可以通过许多不同的参数来自定义图表以达到对数据的可视化要求。 通过学习这些参数,可以更好地展示数据的重要性和影响,并更好地洞察背后的趋势。
极客笔记