Python是一种高级编程语言,广泛用于数据分析和数据可视化。在数据可视化方面,Python提供了许多库和工具,其中之一是用于绘制饼状图的库。饼状图可以用于显示不同类别之间的关系,以及每个类别所占总量的百分比。在以下内容中,我们将介绍如何使用Python绘制饼状图,以及如何使图表更加可视化和有吸引力。
一、引入和导入数据
在绘制饼状图之前,需要将数据导入Python的环境中。在此示例中,我们将使用Pandas变量从CSV文件中读取数据。
import pandas as pd
# 从csv文件中导入数据
data = pd.read_csv('piechart_data.csv')
数据的结构应为具有标签和数值列的表格。对于此示例,我们将创建一个包含不同市场份额的公司名称和百分比的数据框。以下是数据框的示例:
Company Share
0 Company A 28.3
1 Company B 21.5
2 Company C 20.3
3 Company D 14.7
4 Company E 8.9
5 Other Small 6.3
二、绘制一个简单的饼状图
在导入了数据并确保数据适合绘制饼状图后,可以开始绘制饼状图。在此示例中,我们将使用Matplotlib库中的pyplot函数来创建和配置图表,以及进行一些基本的格式化操作。
首先,我们需要导入matplotlib库。
import matplotlib.pyplot as plt
接下来,我们创建一个基本的饼状图。该图表将显示每个公司所占的市场份额,以及每个公司的名称。
# 创建图像并设置大小
plt.figure(figsize=(8,8))
# 创建一个饼状图
plt.pie(data['Share'], labels=data['Company'])
# 显示图形
plt.show()
该代码将生成以下的饼状图:
在上面的代码中,plt.figure()
语句创建了一个新的图像,并指定了其大小。接下来,plt.pie()
语句创建了一个饼状图。在此语句中,我们将公司份额指定为数据框中的“Share”列,labels参数指定数据框中的“Company”列用作标签。
在饼状图被创建之后,使用plt.show()
我们进行展示。
三、让饼状图更具视觉吸引力
1. 格式化标准的饼状图
为了使饼图更具视觉吸引力,可以对其进行更多的格式设置。
首先,我们将添加一些文本和图例。使用plt.title()
可以添加图表的标题。
plt.title('Market Share by Company') # 添加标题
可以使用plt.legend()
添加图例。默认情况下,Matplotlib将将数据中的每个类别显示为饼状图的颜色和图例。但是,您可以使用该labels参数创建自定义标签。
plt.legend(data['Company'], loc='best') # 添加图例
将图例定位到程序最佳位置需要使用loc参数。
接下来,我们要为该图表添加颜色映射和指定颜色模式。可以通过使用plt.pie()
的colors功能来完成此操作。
colors = ['#ff9999','#66b3ff','#99ff99','#ffcc99','#ffb3e6','#c2c2f0']
plt.pie(data['Share'], autopct='%1.1f%%', startangle=90,
colors=colors, wedgeprops={'edgecolor':'black'})
其输出可视化如下:
2.自定义饼状图
有很多方法可以自定义饼状图。以下是一些简单的更新。首先,我们将更改饼图的样式,使其看起来像甜甜圈而不是标准的饼状图。这可以通过添加一个环来完成,该环与饼状图外部的边框相对应。可以通过添加一个空心圆来创建该环,并设置其大小和颜色。
circle = plt.Circle(xy=(0,0), radius=0.7, color='white')
plt.gca().add_artist(circle)
接下来,我们将添加注释。可以使用plt.annotate()
在图表中添加注释,以便更好地说明其内容。
plt.annotate('Market Share by Company', xy=(0, 0), color='black',
fontsize=15, ha='center')
plt.annotate('Total 100%', xy=(0, -0.2), color='black',
fontsize=10, ha='center')
将每个公司的百分比文本添加到相应的图块上,可以单击细分以高亮显示特定图块:
bbox_props = dict(boxstyle="square,pad=0.3", fc="w", ec="k", lw=0.72)
# 添加每个类别的百分比文本
wedges, texts, autotexts = plt.pie(data['Share'], autopct='%1.1f%%',startangle=90, colors=colors,wedgeprops={'edgecolor': 'black'},
textprops=dict(color="black"))
plt.setp(autotexts, size=10, weight="bold")
for i, p in enumerate(wedges):
ang = (p.theta2 - p.theta1)/2. + p.theta1
y = (np.sin(np.deg2rad(ang)))
x = (np.cos(np.deg2rad(ang)))
horizontalalignment = {-1: "right", 1: "left"}[int(np.sign(x))]
connectionstyle = "angle,angleA=0,angleB={}".format(ang)
ax.annotate(data['Company'][i], xy=(x, y), xytext=(1.35*np.sign(x), 1.4*y),
horizontalalignment=horizontalalignment, fontweight='bold',
textcoords="offset points", ha=horizontalalignment, va='center',
bbox=bbox_props, arrowprops=dict(arrowstyle='-', connectionstyle=connectionstyle),
fontsize=10)
完整代码如下:
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
# 从csv文件中导入数据
data = pd.read_csv('piechart_data.csv')
# 创建图像并设置大小
plt.figure(figsize=(8,8))
# 创建一个饼状图
colors = ['#ff9999','#66b3ff','#99ff99','#ffcc99','#ffb3e6','#c2c2f0']
circle = plt.Circle(xy=(0,0), radius=0.7, color='white')
plt.gca().add_artist(circle)
# 添加每个类别的百分比文本
bbox_props = dict(boxstyle="square,pad=0.3", fc="w", ec="k", lw=0.72)
wedges, texts, autotexts = plt.pie(data['Share'], autopct='%1.1f%%', startangle=90,
colors=colors, wedgeprops={'edgecolor': 'black'},
textprops=dict(color="black"))
plt.setp(autotexts, size=10, weight="bold")
for i, p in enumerate(wedges):
ang = (p.theta2 - p.theta1)/2. + p.theta1
y = (np.sin(np.deg2rad(ang)))
x = (np.cos(np.deg2rad(ang)))
horizontalalignment = {-1: "right", 1: "left"}[int(np.sign(x))]
connectionstyle = "angle,angleA=0,angleB={}".format(ang)
ax.annotate(data['Company'][i], xy=(x, y), xytext=(1.35*np.sign(x), 1.4*y),
horizontalalignment=horizontalalignment, fontweight='bold',
textcoords="offset points", ha=horizontalalignment, va='center',
bbox=bbox_props, arrowprops=dict(arrowstyle='-', connectionstyle=connectionstyle),
fontsize=10)
# 添加标题和图例
plt.title('Market Share by Company')
plt.legend(data['Company'], loc='best')
# 添加注释
plt.annotate('Market Share by Company', xy=(0, 0), color='black',
fontsize=15, ha='center')
plt.annotate('Total 100%', xy=(0, -0.2), color='black',
fontsize=10, ha='center')
# 显示图形
plt.show()
以上就是Python饼状图分析的基础部分以及如何令饼状图更具视觉吸引力的例子。开发人员可以在需要时使用此示例以及适当的数据来构建自己的饼状图。