概述
饼图(Pie Chart)主要用于展示数据的相对比例和分布,特别适用于以下情况:
- 相对比例显示:饼图可将数据集中各部分的相对比例以圆形的方式直观展示,帮助观众迅速理解不同部分的重要性。
- 数据分布:饼图有助于展示数据的分布情况,特别是当各部分之间的差异较大时。
- 占比分析:饼图可以用于展示每个部分占总体的百分比,帮助观众理解各部分的相对贡献。
- 相对大小比较:饼图可用于比较不同组或部分之间的相对大小,从而快速识别哪个部分最大或最小。
饼图通过将整个圆分成扇形部分,每个扇形的角度表示相应数据部分的相对大小,通常用于可视化离散数据或各部分的百分比。然而,饼图通常不适合显示太多部分或存在细微差异的数据,因为这会导致图形变得混乱难以理解。
matplotlib绘制饼图
单图示例代码
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"]=["SimHei"] # 设置字体
plt.rcParams["axes.unicode_minus"] = False # 该语句解决图像中的“-”负号的乱码问题
# 示例数据
channels = ['线上商店', '实体店', '批发商', '其他']
sales = [35000, 22000, 30000, 15000]
# 颜色
colors = ['gold', 'lightcoral', 'lightskyblue', 'lightgreen']
# 突出显示某个部分
explode = (0.1, 0, 0, 0)
# 创建饼图
plt.pie(sales, # 数据数组,表示每个部分的大小
explode=explode, # 用于突出显示某个部分的偏移量的数组
labels=channels, # 每个部分的标签数组
colors=colors, # 每个部分的颜色数组
autopct='%.1f%%', # 控制百分比显示的格式
shadow=True, # 是否添加阴影效果
startangle=140) # 起始角度,以逆时针方向测量,从x轴正方向开始计算角度
# 设置图表标题
plt.title('产品销售渠道分布')
# 显示图表
plt.show()
多图示例代码
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"]=["SimHei"] # 设置字体
plt.rcParams["axes.unicode_minus"] = False # 该语句解决图像中的“-”负号的乱码问题
# 1、准备数据
# 第一个饼图的数据
channels_1 = ['线上商店', '实体店', '批发商', '其他']
sales_1 = [35000, 22000, 30000, 15000]
colors_1 = ['gold', 'lightcoral', 'lightskyblue', 'lightgreen']
explode_1 = (0.1, 0, 0, 0)
# 第二个饼图的数据
channels_2 = ['线上商店', '实体店', '批发商','其他']
sales_2 = [25000, 32000, 20000,19000]
colors_2 = ['gold', 'lightcoral', 'lightskyblue', 'lightgreen']
explode_2 = (0, 0.1, 0, 0)
# 2、创建两个子图
fig, axs = plt.subplots(1, 2, figsize=(10, 4))
# 3、绘图
# 第一个子图
axs[0].pie(sales_1, explode=explode_1, labels=channels_1, colors=colors_1, autopct='%1.1f%%', shadow=True, startangle=140)
axs[0].set_title('产品1销售渠道分布')
# 第二个子图
axs[1].pie(sales_2, explode=explode_2, labels=channels_2, colors=colors_2, autopct='%1.1f%%', shadow=True, startangle=140)
axs[1].set_title('产品2销售渠道分布')
# 4、显示图表
plt.show()
对于pie函数里边的参数注释请见matplotlib绘制饼图-单图示例代码部分注释!
seaborn绘制饼图
单图示例代码
import seaborn as sns
import matplotlib.pyplot as plt
sns.set(rc={'font.sans-serif': ['simhei', 'Arial']}) # 处理图形显示中文乱码问题
# 数据
channels = ['线上商店', '实体店', '批发商', '其他']
sales = [35000, 22000, 30000, 15000]
colors = sns.color_palette("pastel")
# 创建饼图
plt.pie(sales, labels=channels, autopct='%1.1f%%', startangle=140, colors=colors)
# 设置图表标题
plt.title('产品销售渠道分布')
# 显示图表
plt.show()
Seaborn并没有提供直接的
sns.pie
函数,因为饼图通常不是Seaborn的主要关注点。Seaborn主要专注于统计数据可视化,例如散点图、箱线图、分布图等。Matplotlib在绘制饼图方面提供了直接的函数
plt.pie
,而Seaborn则提供了一些用于设置图形样式和美化的函数。尽管Seaborn没有特定的pie
函数,你仍然可以结合使用Seaborn和Matplotlib,以使用Seaborn的美化特性,然后使用Matplotlib的plt.pie
函数来创建饼图。
sns.color_palette("pastel")
:使用 Seaborn 库中的color_palette
函数创建一个颜色调色板,名为 “pastel”,它是一种颜色主题,通常包含柔和、较淡的颜色,适合用于提供视觉吸引力且不过于显眼的图表。
多图示例代码
import seaborn as sns
import matplotlib.pyplot as plt
sns.set(rc={'font.sans-serif': ['simhei', 'Arial']}) # 处理图形显示中文乱码问题
# 1、准备数据
# 第一个饼图的数据
channels_1 = ['线上商店', '实体店', '批发商', '其他']
sales_1 = [35000, 22000, 30000, 15000]
colors_1 = sns.color_palette("pastel")
explode_1 = (0.1, 0, 0, 0)
# 第二个饼图的数据
channels_2 = ['线上商店', '实体店', '批发商','其他']
sales_2 = [25000, 32000, 20000,19000]
colors_2 = sns.color_palette("pastel")
explode_2 = (0, 0.1, 0, 0)
# 2、创建两个子图
fig, axs = plt.subplots(1, 2, figsize=(10, 4))
# 3、绘图
# 第一个子图
axs[0].pie(sales_1, explode=explode_1, labels=channels_1, colors=colors_1, autopct='%1.1f%%', shadow=True, startangle=140)
axs[0].set_title('产品1销售渠道分布')
# 第二个子图
axs[1].pie(sales_2, explode=explode_2, labels=channels_2, colors=colors_2, autopct='%1.1f%%', shadow=True, startangle=140)
axs[1].set_title('产品2销售渠道分布')
# 4、显示图表
plt.show()
上面的代码和matplotlib绘制饼图中的单图示例代码唯一区别在于seaborn与matplotlib结合可以运用seaborn的内置调色板,美化图表,提高可读性。调色板的特点是颜色之间的对比度适中,避免过于显眼或难以区分。
plotly绘制饼图
单图示例代码
import plotly.express as px
# 数据
channels = ['线上商店', '实体店', '批发商', '其他']
sales = [35000, 22000, 30000, 15000]
# 创建饼图
fig = px.pie(
names=channels,
values=sales,
title='产品销售渠道分布',
color_discrete_map=px.colors.qualitative.Plotly # 使用 Plotly Express 内置的颜色主题
)
# 显示图表
fig.show()
Plotly Express 内置的颜色主题与seaborn的调色板都旨在提供一组在可视化中使用的预定义颜色。它们的共性在于它们都是为了使图表更易读、美观、且颜色之间的对比度适中。
饼图参数没有x,y,取而代之是names,values
- ‘names’:表示显示扇区的标签;
- ‘value’:表示显示扇区的数值。
多图示例代码
在plotly
中,每个子图的图例可以共享,也可以每一个子图单独设置一个图例组独立显示。在下面第二个方法有讲到为每一个子图单独设置一个图例组。
Plotly Express(px)方法
import plotly.express as px
from plotly.subplots import make_subplots
# 示例数据
channels_1 = ['线上商店', '实体店', '批发商', '其他']
sales_1 = [35000, 22000, 30000, 15000]
channels_2 = ['线上商店', '实体店', '批发商', '其他']
sales_2 = [25000, 35000, 20000, 21000]
# 创建子图
fig = make_subplots(rows=1, cols=2, subplot_titles=("产品 1", "产品 2"), specs=[[{'type': 'domain'}, {'type': 'domain'}]])
# 添加第一个子图
trace1 = px.pie(labels=channels_1, values=sales_1, title='产品1')
fig.add_trace(trace1.data[0], row=1, col=1)
# 添加第二个子图
trace2 = px.pie(labels=channels_2, values=sales_2, title='产品2')
fig.add_trace(trace2.data[0], row=1, col=2)
# 更新布局
fig.update_layout(title_text='产品销售渠道分布比较')
# 显示图表
fig.show()
px多图绘制怎么显示图例暂时没找到方法,但下面的go方法可以实现,用后者即可。
Plotly Graph Objects(go)方法
import plotly.graph_objects as go
from plotly.subplots import make_subplots
# 示例数据
channels_1 = ['线上商店', '实体店', '批发商', '其他']
sales_1 = [35000, 22000, 30000, 15000]
channels_2 = ['线上商店', '实体店', '批发商', '其他']
sales_2 = [25000, 35000, 20000, 21000]
# 创建子图
fig = make_subplots(rows=1,
cols=2,
subplot_titles=("产品 1", "产品 2"),
specs=[[{'type': 'domain'}, {'type': 'domain'}]])
# 添加第一个子图
trace1 = go.Pie(labels=channels_1,
values=sales_1,
name='产品1',
legendgroup='product_1', # 图例组的名称,用于将图例分组
legendgrouptitle=dict(text='产品1销售渠道')) # 图例组的标题
fig.add_trace(trace1, row=1, col=1)
# 添加第二个子图
trace2 = go.Pie(labels=channels_2,
values=sales_2,
name='产品2',
legendgroup='product_2', # 图例组的名称,用于将图例分组
legendgrouptitle=dict(text='产品2销售渠道')) # 图例组的标题
fig.add_trace(trace2, row=1, col=2)
# 更新布局
fig.update_layout(title_text='产品销售渠道分布比较', showlegend=True)
# 显示图表
fig.show()
make_subplots函数中
specs
参数的目的是显式指定每个子图的类型,以避免自动推断时可能引起的错误。在上面的情况下,由于使用了make_subplots
创建子图,该函数会尝试自动推断子图的类型,但由于包含go.Pie
类型的图,导致了不匹配的错误。通过显式指定
specs
,告诉make_subplots
应该在指定的位置创建type: 'domain'
(饼图类型)的子图。这样,就避免了自动推断时的错误。
案例
通过可视化经验值的频数,可能能够得出一些有关数据集中人员经验水平的洞察,例如哪些经验水平较为常见,哪些较为罕见。这类可视化有助于直观地理解数据的组成和特征分布,为进一步的分析提供了基础。
import plotly.express as px
# 从数据集中获取 "experience" 列的唯一值,并计算每个唯一值的频数
exp = train_data['experience'].value_counts()
# 使用 Plotly Express 创建饼图
fig = px.pie(values=exp.values,
names=exp.index,
title='产品销售渠道分布',
color_discrete_sequence=px.colors.sequential.PuBu,
template='plotly_dark')
# 更新图表的扇区属性,
fig.update_traces(
# textinfo='percent', # 设置每个饼图扇区上显示的文本信息
marker=dict(line=dict(width=2, color='gray')) # 设置边线的宽度和颜色
)
# 更新图表的布局,设置字体大小和字体系列
fig.update_layout(
font=dict(size=20,family="Franklin Gothic"))
# 显示生成的饼图
fig.show()