注: 很早之前就打算专门写一篇与 Python 数据可视化相关的博客, 对一些基本概念和常用技巧做一个小结. 今天终于有时间来完成这个计划了!
0. Python 中常用的可视化工具
Python 在数据科学中的地位, 不仅仅是因为 numpy, scipy, pandas, scikit-learn 这些高效易用, 接口统一的科学计算包, 其强大的数据可视化工具也是重要组成部分. 在 Python 中, 使用的最多的数据可视化工具是 matplotlib, 除此之外还有很多其他可选的可视化工具包, 主要包括以下几大类:
matplotlib 以及基于 matplotlib 开发的工具包: pandas 中的封装 matplotlib API 的画图功能, seaborn,networkx 等;
基于 JavaScript 和 d3.JS 开发的可视化工具: plotly 等, 这类工具可以显示动态图且具有一定的交互性;
其他提供了 Python 调用接口的可视化工具: OpenGL, GraphViz 等, 这一类工具各有特点且在特定领域应用广泛.
对于数据科学, 用的比较多的是 matplotlib 和 seaborn, 对数据进行动态或交互式展示时会用到 plotly.
1. matplotlib 与 MATLAB
Matplotlib 是建立在 NumPy 数组基础上的多平台数据可视化程序库, John Hunter 在 2002 年提出了 matplotlib 的初步构想 -- 在 Python 中画出类似 MATLAB 风格的交互式图形. 鉴于此种渊源, 类似 MATLAB 风格的画图接口是 matplotlib 的两种画图接口之一. 这类接口直观, 便捷, 许多语法与 MATLAB 类似, 也是初学者常用的方式.
这种接口最重要的特性是有状态的 (stateful): 它会持续跟踪 "当前的" 图形和坐标轴, 所有 plt 命令都可以应用. 可以用 plt.gcf()(获取当前图形) 和 plt.gca()(获取当前坐标轴)来查看具体信息.
matplotlib 画图的基本设置:
- import matplotlib as mpl
- import matplotlib.pyplot as plt
- mpl.rcParams['axes.linewidth'] = 1.5 #set the value globally, 设置坐标轴线宽
- import seaborn as sns
- sns.set() # 使用 seaborn 设置绘图风格
更多自定义设置可以参考官方文档: Customizing matplotlib https://matplotlib.org/users/customizing.html
下面使用 MATLAB 风格画图, 对一组分类变量 (categorical variables) 进行可视化
- names = ['group_a', 'group_b', 'group_c'] # 不同分类的名称
- values = [1, 10, 100] # 不同分类对应的值
- plt.figure(1, figsize=(9, 3)) # 设置图片大小
- plt.subplot(131) # 1x3, 第一个子图
- plt.bar(names, values) # 柱状图
- plt.subplot(132) # 1x3, 第二个子图
- plt.scatter(names, values) # 散点图
- plt.subplot(133) # 1x3, 第三个子图
- plt.plot(names, values) # 折线图
- plt.suptitle('Categorical Plotting') # 图片的标题
- # w_pad 设置子图之间的间隔宽度; rect 设置整个图像部分 (矩形) 的左上点坐标和右下点坐标, 默认值为[0, 0, 1, 1]
- plt.tight_layout(w_pad=0.1, rect=[0, 0.03, 1, 0.95])
- plt.savefig('demo1.PNG', dpi=200) # 保存图片
图片如下:
图 1: 分类变量的可视化
这种方式画图非常直观, 每一步都对 "plt" 对象有一个特定的操作, 画图的过程至上而下, 画好之后保存图片. 其他命令说明如下:
subplot(131)表示设置子图为 1 行 3 列, 且当前为第 1 个子图;
在保存图片之前调用 tight_layout()函数可以使图片更加紧凑, 边框更窄, 更多关于该函数的用法可参考官方文档;
保存图片是可以使用参数 dpi 设置图片的分辨率.
在官方文档中, 这种风格的 API 被称为 "pyplot API".
一个简短的入门级教程: Pyplot tutorial
更多的介绍可以参考文档: The pyplot API
更多例子可以参考官方的 Gallery https://matplotlib.org/gallery/index.HTML
2. matplotlib 的第二种风格 -- 面向对象的画图接口
在面向对象编程中有一句口号:"一切皆对象",Python 既然是一种面向对象的编程语言, 画图也自然可以使用面向对象的方式. MATLAB 风格的画图接口直观易用, 但是遇到一些精细操作时, 就会比较麻烦. 面向对象的画图接口可以适应更复杂的场景, 更精细的控制需要展示的图形.
在面向对象接口中, 画图函数不再受到当前 "活动" 图形或坐标轴的限制, 而变成了显式的 Figure 和 Axes 的方法. 在画图的过程中, 实际操作的是这两个类的实例: figure 和 axes.
figure(plt.Figure 类的一个实例)可以被看成是一个能够容纳各种坐标轴, 图形, 文字和标签的容器. axes(plt.Axes 类的一个实例)是一个带有刻度和标签的矩形, 最终会包含所有可视化的图形元素. 通常使用变量 fig 表示一个图形实例, 用变量 ax 表示一个坐标轴实例或一组坐标轴实例.
下面是一个使用面向对象的 API 画图的例子:
- import numpy as np
- import matplotlib.pyplot as plt
- %matplotlib inline
- # example data
- x = np.arange(0.1, 4, 0.5)
- y = np.exp(-x)
- #设置 error bar 的 (单侧) 长度
- error = 0.1 + 0.2 * x
- # 使用 subplots 返回 fig 和 ax 实例
- fig, (ax0, ax1) = plt.subplots(nrows=2, sharex=True, figsize=(8, 6)) # 两个子图, 返回两个 Axes 实例
- # 第一个子图, 对称的 error bar
- ax0.errorbar(x, y, yerr=error, fmt='-o')
- ax0.set_title('variable, symmetric error')
- # 分别设置 error bar 两侧的长度
- lower_error = 0.4 * error
- upper_error = error
- asymmetric_error = [lower_error, upper_error]
- # 第二个子图, 不对称的 error
- ax1.errorbar(x, y, xerr=asymmetric_error, fmt='o')
- ax1.set_title('variable, asymmetric error')
- ax1.set_yscale('log')
- fig.tight_layout()
- fig.savefig('demo2.PNG', dpi=200) # 保存图片
结果如下:
图 2:error bar 的可视化
如上面的例子显示的那样, 可以使用函数 plt.subplots()返回 fig 和 ax 实例, 也可以直接使用 plt.Figure 和 plt.Axes 这两个类来返回各自的实例:
- import numpy as np
- import matplotlib.pyplot as plt
- plt.style.use('seaborn-whitegrid')
- %matplotlib inline
- fig = plt.figure(figsize=(8, 6))
- ax = plt.axes()
- x = np.linspace(0, 10, 100)
- ax.plot(x, np.sin(x))
- ax.set_xlabel('x', size=14)
- ax.set_ylabel('sin x', size=14)
- ax.set_title('sin plot', size=16)
- fig.tight_layout()
- fig.savefig('demo3.PNG', dpi=200)
结果如下:
图 3:sin 函数图像
当我们获取 fig 和 ax 实例后, 就可以直接操作这两个实例来完成想要可视化效果. 操作这两个实例的方法众多, 可参考下面的官方文档:
关于该 API 的描述: The object-oriented API
所有元素的最高等级容器:
坐标轴 ax 类: The Axes class https://matplotlib.org/API/axes_api.HTML
一些使用 ax 实例的例子: Examples using matplotlib.pyplot.axes
创建 fig 和坐标轴实例的 subplots 函数:
3. 统计作图以及图片的风格
除了 matplotlib 之外, https://seaborn.pydata.org/index.HTML 是专门为统计制图开发的可视化工具. 除了直接用于数据的可视化之外, 还能够完成一些常见的统计功能来辅助画图, 例如误差线的估计, 密度估计, 箱形图分位数的计算等. 此外, 与 matplotlib 相比, seborn 画图的风格更美观. 因此该可视化工具在数据分析中也用的比较多.
按照文档中对 API 的介绍 https://seaborn.pydata.org/API.HTML ,seaborn 主要将统计制图分为下面几类:
关系图
分类图
分布图
回归图
矩阵图: heatmap 或聚类图
使用 seaborn 画图的例子可以参考: Example gallery
上面例子中涉及到两次对画图风格的设置, 风格主要包括对图的配色, 背景色, 坐标轴, 字体, 透明度等的设置. 在 matplotlib 中主要有以下风格可选:
- > print(plt.style.available)
- #---output---#
- ['dark_background', 'seaborn-notebook', 'seaborn-darkgrid', '_classic_test', 'ggplot', 'seaborn-bright', 'classic',
- 'Solarize_Light2', 'fast', 'fivethirtyeight', 'seaborn-dark-palette', 'seaborn', 'tableau-colorblind10', 'seaborn-muted',
- 'seaborn-whitegrid', 'seaborn-ticks', 'seaborn-dark', 'seaborn-white', 'grayscale', 'seaborn-deep', 'seaborn-poster',
- 'seaborn-talk', 'seaborn-colorblind', 'bmh', 'seaborn-pastel', 'seaborn-paper']
参考上面的 Customizing matplotlib 链接, 各种不同样式的比较可以参考: Matplotlib Style Gallery
4. 常见的作图类型及功能
matplotlib 可以画大部分常见的图, 例如柱状图, 折线图, 饼图, 直方图等.
更多详情可以参考: Plotting-basic https://matplotlib.org/API/axes_api.HTML#plotting
- Reference
- https://tonysyu.GitHub.io/raw_content/matplotlib-style-gallery/gallery.HTML
- https://jakevdp.GitHub.io/PythonDataScienceHandbook/
- https://seaborn.pydata.org/index.HTML
- https://matplotlib.org/index.HTML
- https://Stack Overflow.com/questions/8248467/matplotlib-tight-layout-doesnt-take-into-account-figure-suptitle
来源: https://www.cnblogs.com/Belter/p/9650433.html