Python数据可视化:Matplotlib、Seaborn、Plotly饼图绘制

概述

饼图(Pie Chart)主要用于展示数据的相对比例和分布,特别适用于以下情况:

  1. 相对比例显示:饼图可将数据集中各部分的相对比例以圆形的方式直观展示,帮助观众迅速理解不同部分的重要性。
  2. 数据分布:饼图有助于展示数据的分布情况,特别是当各部分之间的差异较大时。
  3. 占比分析:饼图可以用于展示每个部分占总体的百分比,帮助观众理解各部分的相对贡献。
  4. 相对大小比较:饼图可用于比较不同组或部分之间的相对大小,从而快速识别哪个部分最大或最小。

饼图通过将整个圆分成扇形部分,每个扇形的角度表示相应数据部分的相对大小,通常用于可视化离散数据或各部分的百分比。然而,饼图通常不适合显示太多部分或存在细微差异的数据,因为这会导致图形变得混乱难以理解。

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()

在这里插入图片描述

  • 28
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值