Python是一种功能强大的编程语言,也是一种流行的数据分析工具,其数据可视化能力也非常强大,本章我们将结合实际案例介绍Python的主要数据可视化库,包括Matplotlib、Pyecharts、Seaborn、Plotly、Altair、NetworkX等。
Matplotlib是Python中最流行的数据可视化库之一,基于Numpy的数组运算功能,提供了各种图形和图表的绘制工具,用户通过使用Matplotlib可以轻松地画一些简单或复杂的地图形,编写几行代码即可生成线图、直方图、功率谱、条形图、错误图、散点图等。Matplotlib的特点是功能强大、灵活性高、可定制性强,可以满足各种数据可视化的需求。
Matplotlib的主要功能包括:
绘制各种图形:Matplotlib支持多种图形的绘制,包括线图、柱状图、散点图、饼图、直方图等。
定制图形样式:Matplotlib提供了丰富的样式选项,用户可以自定义图形的颜色、线型、标签、字体等。
支持多种数据格式:Matplotlib支持多种数据格式,包括Python列表、NumPy数组、Pandas数据框等。
支持交互式操作:Matplotlib支持鼠标悬停、缩放、拖拽等交互操作,用户可以更加灵活地探索数据。
支持多种输出格式:Matplotlib支持多种输出格式,包括PNG、PDF、SVG等,用户可以根据自己的需求选择不同的输出格式。
Python绘图库众多,各有各的特点,但是Maplotlib是一个非常基础的Python可视化库,如果需要学习Python数据可视化,那么Maplotlib是非学不可的,之后再学习其他库就比较简单了。Matplotlib的中文学习资料比较丰富,其中最好的学习资料是其官方网站的帮助文档,用户可以在上面查阅自己感兴趣的内容。
安装Anaconda后,会默认安装Matplotlib库,如果要单独安装Matplotlib库,则可以通过pip命令实现,命令为pip install Matplotlib,前提是需要先安装pip包。
误差条形图是一类特殊的条形图,由带标记的线条组成,用于显示有关图形中所显示数据的统计信息,误差条形图具有三个Y值,即平均值、下限误差值、上限误差值。
操作者可以将统计信息手动分配给每个点,但在大多数情况下,是根据其他序列中的数据来计算的,Y值的顺序十分重要,因为值数组中的每个位置都表示误差条形图上的一个数值。
Matplotlib绘制条形图,使用plt.bar()函数,参数如下:
plt.bar(x,height,width=0.8,bottom=None,*,align='center',data=None,**kwargs)
plt.bar()函数的参数说明如表7-1所示。
表7-1 plt.bar()函数参数
参数 |
说明 |
x |
设置横坐标 |
height |
条形的高度 |
width |
条形图宽度,默认值为0.8 |
botton |
条形的起始位置 |
align |
条形的中心位置 |
color |
条形的颜色 |
edgecolor |
边框的颜色 |
linewidth |
边框的宽度 |
tick_label |
下标的标签 |
log |
y轴使用科学计数法表示 |
orientation |
是竖直条还是水平条 |
为了深入研究企业2022年不同地区的销售业绩是否达标,拟定的最低业绩目标是50万元,我们绘制了各地区销售额的误差条形图,具体代码如下:
#导入第三方包
import pymysql
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
from sqlalchemy import create_engine
mpl.rcParams['font.sans-serif']=['SimHei'] #显示中文
plt.rcParams['axes.unicode_minus']=False #正常显示负号
#连接MySQL数据库
conn = create_engine('mysql+pymysql://root:[email protected]:3306/sales')
#读取订单表数据
sql = "SELECT region,ROUND(SUM(sales)/10000,2) as sales, ROUND(SUM(sales)/10000-30,2) as err FROM orders where dt=2022 GROUP BY region order by err desc"
df = pd.read_sql(sql,conn)
#设置图形大小
plt.figure(figsize=(12,7))
colors = ['DarkSlateBlue','DarkBlue','DarkCyan','DarkGreen','MidnightBlue','Blue']
plt.bar(df['region'], df['sales'], yerr=df['err'], width=0.8, align=
'center', ecolor='Maroon', alpha=0.9,color=colors, label='地区销售额');
#添加数据标签
for a,b in zip(df['region'],df['sales']):
plt.text(a, b+0.05, '%.2f' % b, ha='center', va= 'bottom',fontsize=16)
#设置坐标轴刻度值大小以及刻度值字体
plt.tick_params(labelsize=16)
plt.rc('font',size=16)
#添加坐标轴标签
plt.xlabel('地区名称',size=16)
plt.ylabel('销售额',size=16)
plt.title('2022年各地区销售业绩完成情况',size=20)
plt.legend(loc='upper right',fontsize=16)
plt.show()
在JupyterLab中运行上述代码,生成如图7-1所示的各门店销售额的误差条形图,从图2-12中可以看出,在2020年,各地区的销售额与业绩目标50万元之间的差距,其中,只有西南和西北地区没有完成业绩,分别是47.54万元、31.10万元,其他地区均超额完成目标。
图7-1 误差条形图
Pyecharts是一个基于Python语言的数据可视化库,它基于Echarts.js实现了各种图表的绘制,包括折线图、柱状图、散点图、地图等。Pyecharts以简单易用、美观大方、交互性强等优点受到了广泛的欢迎。截至2023年6月,Pyecharts的最新版本是2.0.3,注意Pyecharts的V2版本系列已从Echarts 4切换到Echarts 5,支持Python3.6至Python 3.11。
Pyecharts的主要功能包括:
数据可视化:Pyecharts支持各种图表的绘制,可以帮助用户将数据转化为可视化的图形,更直观地展示数据。
交互性强:Pyecharts支持鼠标悬停、缩放、拖拽等交互操作,用户可以更加灵活地探索数据。
简单易用:Pyecharts的API设计简单易懂,用户可以快速上手,实现自己想要的图表效果。
多种输出格式:Pyecharts支持多种输出格式,包括HTML、图片、SVG等,用户可以根据自己的需求选择不同的输出格式。
支持多种数据格式:Pyecharts支持多种数据格式,包括Python列表、字典、Pandas数据框等,用户可以根据自己的数据格式选择合适的API。
Pyecharts的主要图形包括:
(1)基本图形:共计13类,包括日历图、漏斗图、仪表盘、关系图、水球图、平行坐标系、饼图、极坐标系、雷达图、桑基图、旭日图、主题河流图、词云图。
(2)直角坐标系图形:共计9类,包括柱状图/条形图、箱形图、涟漪特效散点图、热力图、K线图、折线/面积图、象形柱状图、散点图、层叠多图。
(3)树形图表:共计2类,包括树图、矩形树图。
(4)地理图表:共计3类,包括地理坐标系、地图、百度地图。
(5)3D图表:共计7类,包括3D柱状图、3D折线图、3D散点图、3D曲面图、3D路径图、三维地图、GL关系图。
(6)组合图表:共计4类,包括并行多图、顺序多图、选项卡多图、时间线轮播多图。
(7)HTML组件:共计3类,包括通用配置项、表格、图像。
总之,Pyecharts是一个功能强大、易于使用的数据可视化库,可以帮助用户快速、直观地展示数据,提高数据分析的效率和准确性。
主题河流图是一种特殊的流图,它主要用来表示事件或主题等在一段时间内的变化。它是一种围绕中心轴线移位的堆积面积图,显示了不同类别的数据随时间的变化情况,使用流动的有机形状,类似于河流的水流。
在主题河流图中,每个流的形状大小与每个类别中的值成比例,平行流动的轴变量一般用于显示时间,在时间序列数据的可视化分析中比较实用。主题河流图是显示大数据集的最优选择,可以显示数据随时间的变化趋势。
主题河流图在时间序列数据的可视化分析中比较实用,当我们需要探索几个不同主题的热度(或其他统计量)随时间的演变趋势,并在同时期进行比较时就可以使用该图形。
Pyecharts主题河流图的参数配置如表7-2所示。
表7-2 Pyecharts主题河流图参数
参数 |
说明 |
series_name |
系列名称,用于 tooltip 的显示,legend 的图例筛选 |
data |
系列数据项 |
is_selected |
是否选中图例 |
label_opts |
标签配置项 |
tooltip_opts |
提示框组件配置项 |
singleaxis_opts |
单轴组件配置项 |
为了分析2022年10月份某企业不同类型商品的利润额情况,可以绘制其不同商品利润额的主题河流图,代码如下:
#声明Notebook类型,必须在引入pyecharts.charts等模块前声明
from pyecharts.globals import CurrentConfig, NotebookType
CurrentConfig.NOTEBOOK_TYPE = NotebookType.JUPYTER_LAB
import pymysql
from pyecharts import options as opts
from pyecharts.charts import Page, ThemeRiver
#连接MySQL表数据
conn = pymysql.connect(host='127.0.0.1',port=3306,user='root',password='root',db='sales',charset='utf8')
cursor = conn.cursor()
#读取MySQL表数据
sql_num = "SELECT order_date,ROUND(SUM(profit),2),category FROM orders WHERE order_date>='2022-10-01' and order_date<='2022-10-31' GROUP BY category,order_date"
cursor.execute(sql_num)
sh = cursor.fetchall()
v1 = []
v2 = []
for s in sh:
v1.append([s[0],s[1],s[2]])
#绘制主题河流图
def themeriver() -> ThemeRiver:
c = (
ThemeRiver()
.add(
["办公类","家具类","技术类"],
v1,
singleaxis_opts=opts.SingleAxisOpts(type_="time", pos_bottom="20%")
)
.set_global_opts(title_opts=opts.TitleOpts(title="不同类型商品利润额比较分析"),
toolbox_opts=opts.ToolboxOpts(),
legend_opts=opts.LegendOpts(is_show=True,pos_left ='center',pos_top ='top',item_width = 20,item_height = 20)
)
.set_series_opts(label_opts=opts.LabelOpts(position='top',color='black',font_size=15))
)
return c
#第一次渲染时候调用load_javasrcript文件
themeriver().load_javascript()
#展示数据可视化图表
themeriver().render_notebook()
在Jupyter lab中运行上述代码,生成如图7-2所示的主题河流图,从图形可以看出,在2022年10月份,3种类型商品的利润额波动性都较大。
图7-2 主题河流图
Seaborn是Python中一款基于Matplotlib的高级数据可视化库,它提供了各种美观、多样化的图表,可以快速、方便地绘制统计图形和信息图表。Seaborn的特点是简单易用、美观实用、可定制性强,可以帮助用户快速、直观地展示数据,提高数据分析的效率和准确性。
Seaborn的主要功能包括:
绘制各种图形:Seaborn支持多种图形的绘制,包括线图、柱状图、散点图、热力图、箱线图等。
支持多种数据格式:Seaborn支持多种数据格式,包括Python列表、NumPy数组、Pandas数据框等。
自动化调整图形样式:Seaborn可以自动化调整图形的样式,包括颜色、字体、标签等,使得图形更加美观。
支持统计分析:Seaborn支持统计分析,可以绘制多种统计图形,如核密度图、分布图等。
支持多种输出格式:Seaborn支持多种输出格式,包括PNG、PDF、SVG等,用户可以根据自己的需求选择不同的输出格式。
相对于Matplotlib,Seaborn语法更简洁,两者的关系类似于Numpy和Pandas之间的关系。但是需要注意的是,应该把Seaborn视为Matplotlib的补充,而不是替代物。
安装Anaconda后,会默认安装Seaborn库,如果要单独安装Seaborn库,则可以通过pip install seaborn命令实现,前提是先安装pip包。
在Seaborn中,可以使用boxenplot()函数为大数据集绘制增强的箱型图,也被称为letter value plot或catbox plot,可以显示更多的数据分布信息,包括中位数、四分位数、百分位数等,具体用法如下:
seaborn.boxenplot(x=None, y=None, hue=None, data=None, order=None, hue_order=None, orient=None, color=None, palette=None, saturation=0.75, width=0.8, dodge=True, k_depth='proportion', linewidth=None, scale='exponential', outlier_prop=None, ax=None, **kwargs)
线性回归图boxenplot()函数参数说明如表7-3所示。
表7-3 boxenplot()函数参数
参数 |
说明 |
x |
输入变量x |
y |
输入变量y |
hue |
用来指定第二次分类的数据类别(用颜色区分) |
data |
要显示的数据 |
order |
显式变量y分类顺序 |
hue_order |
显式第二分类的顺序 |
orient |
设置图的绘制方向,垂直(v)或水平(h) |
color |
颜色 |
palette |
用于对数据不同分类进行颜色区别 |
saturation |
饱和度 |
width |
指定箱线图的宽度。 |
dodge |
指定是否对箱线图进行分组。 |
k_depth |
指定箱线图的深度,即显示多少个箱体。默认值是4,可以根据数据分布进行调整。 |
linewidth |
指定箱线图边缘线的宽度。 |
scale |
指定箱线图的缩放比例,可以是"linear"(线性)或"log"(对数)。 |
outlier_prop |
指定异常值的比例,即显示多少个异常值。默认值是0.007,可以根据数据分布进行调整。 |
ax |
绘制到指定轴对象,否则在当前轴对象上绘图 |
为了研究不同类型商品在不同年份的利润额分布情况,下面利用Seaborn绘制了利润额的增强箱型图,具体代码如下:
#导入第三方包
import pymysql
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sqlalchemy import create_engine
#指定图片大小
plt.figure(figsize=[12,7])
#连接MySQL,读取订单表数据
conn = create_engine('mysql+pymysql://root:[email protected]:3306/sales')
sql = "SELECT dt as 年份,category as 商品类别,month(order_date) as 月份,cast(profit as float) as 利润额 FROM orders order by dt asc"
df = pd.read_sql(sql,conn)
#设置显示中文字体
rc = {'font.sans-serif': 'SimHei',
'axes.unicode_minus': False}
sns.set(context='notebook', style='whitegrid', rc=rc)
#设置x轴和y轴的标签大小
plt.xticks(fontsize=13)
plt.yticks(fontsize=13)
#给x轴和y轴加上标签
plt.xlabel("类别",size=16)
plt.ylabel("利润额",size=16)
#绘制增强箱型图
sns.boxenplot(x="商品类别", y="利润额", data=df,hue="年份",palette="Set3")
plt.legend(loc = 'upper right')
plt.show()
在JupyterLab中运行上述代码,生成如图7-3所示的增强箱型图,从图可以看出,不同类型商品的利润额,在2020年、2021年和2022年的数据分布差异不是很明显,但是不同类型商品之间的差异较大,尤其是办公类用品。
图7-3 增强箱图
... ...
... ...
... ...