Excel 能够画饼图,但是限于本列数据为数值类型,对于非数值类型 (non-numeric type) 则无能无力,pandas 作为 excel 的代码版本,当然没有这个限制~

对于数值类型的列,可以直接用下面一行代码完成饼图:

1
df.plot.pie(y='col_name', figsize=(8, 6))

如果 col_name 是非数值列,代码会报以下错误:

1
TypeError: '<' not supported between instances of 'str' and 'int'

下面这个是 Matplotlib 画饼图的 MVP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import pandas as pd

import matplotlib.pyplot as plt
import seaborn as sns

# 设置中文字体和负号正常显示
plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
sns.set_context("paper")
sns.set_style('whitegrid')
sns.set(font='SimHei') # 解决Seaborn中文显示问题


def pie_plot(values, labels, title):
plt.figure(figsize=(10, 6), dpi=100)

# 正圆
plt.axes(aspect='equal')

plt.pie(values, labels=labels, autopct='%.1f%%')

plt.title(title)

plt.legend()

需要用胶水将 pandas 的指定列和这个函数关联起来,胶水之一是 value_counts ,它可以对一列数据的值做字典统计,另外就是unique(),可以列举出某列的所有非重复值,这两份胶水分别对应这个函数的 valueslabels 参数~

1
2
3
pie_plot(df['source'].value_counts().values, df['source'].unique(), '发布机型')

plt.show()

但是还有一个隐藏的问题是,value_counts 不会统计 nan ,但是 unique 会统计 nan,如果不去除 nan 会造成 value_counts().valuesunique 长度不一样~

1
2
3
4
5
6
# 去除 nan 等空值
df.dropna(how='any', subset=['source'], inplace=True)

pie_plot(df['source'].value_counts().values, df['source'].unique(), '发布机型')

plt.show()

最后还有一个优化的点,为了保证图例标签的连续性,可以先给该列排个序~

1
2
3
4
5
6
7
8
9
# 去除 nan 等空值
df.dropna(how='any', subset=['source'], inplace=True)

# 排序
df.sort_values(by=f'source', ascending=True, inplace=True)

pie_plot(df['source'].value_counts().values, df['source'].unique(), '发布机型')

plt.show()

笔者已经把这个小逻辑做成了一个网页小工具,可以在网页上传 CSV 文件,选择任意列(要求该列的值不超过 50 类,可多选)画饼图,可选 AntV、Echarts、Matplotlib 三种画图引擎,网页地址如下:

https://tools.buyixiao.xyz/pie-ploter

欢迎尝试~