数据可视化,即将数据绘制成图表,在数据分析中非常重要。数据可视化可以直观呈现数据,快速发现规律,定位异常问题,对比关联分析,简化复杂信息以及高效沟通回报等。可视化的工具包非常多,有R语言中的ggplot2、pheatmap,有python中的matplotlib、seaborn、plotnine、PyComplexHeatmap等。seaborn、plotnine等都是构建在matplotlib库之上的,seaborn、plotnine可以帮助我们快速绘制图形,而matplotlib则可以高度精细化定制绘图。从今天起一起学习matplotlib绘图python库。
matplotlib简单介绍
Matplotlib 是一个功能全面的 Python 可视化库,用于创建静态、动态和交互式可视化图表。
快速开始
编写使用matplotlib绘制图形的代码有两种风格:面向对象和面向过程的风格。推荐使用面向对象的编程风格。
导入所需模块
# 导入所需模块import numpy as np # 用于准备数据import matplotlib as mplimport matplotlib.pyplot as plt # 直接用于绘图的API在pyplot子模块中
numpy库用于准备数据,matplotlib模块通常别名设置为mpl,该模块包含了几个常用的实例,用于全局设置默认值和样式的mpl.rcParams,按名字存放颜色映射ColorMap的容器mpl.colormaps,按名字存放颜色序列ColorSequence的容器mpl.color_sequences。matplotlib有非常多的子模块,其中pyplot模块是一个基于状态的 matplotlib 接口,它提供了一种类似 MATLAB 的隐式绘图方式,还能在屏幕上打开图形,并充当图形 GUI 管理器。
准备数据
# 准备数据x = np.linspace(0, 2 * np.pi, 100) # 1维ndarray,包含区间[0,2π)均匀分布的100个点y = np.cos(x) # x中所有元素对应的余弦值
面向对象风格
# 面向对象风格绘制图形fig, ax = plt.subplots() # 创建画板Figure对象和子图Axes对象(或子图对象ndarray)ax.plot(x, y, color="green") # 绘制线图,设置线的颜色为绿色plt.show() # 显示图形
面向过程风格
# 面向过程风格绘制图形fig = plt.figure() # 创建Figure对象plt.plot(x, y, color="green") # 绘制线图,颜色设置为绿色plt.show() # 显示图形
plt.subplots()详解
plt.subplots()函数的函数签名如下图所示:
函数返回一个画板Figure对象和子图Axes对象(包含Axes对象的ndarray)。参数nrows和ncols默认值为1,默认情况下返回一个子图Axes对象;如果nrows或者ncols有一个不为1,那么返回的是Axes对象组成的ndarray。通过设置nrows和ncols可以设置一个画板上可以绘制多少个子图。sharex和sharey分别设置所有的子图是否共享相同的X轴和Y轴的刻度。width_ratios和height_ratios分别设置每个子图在占画板的宽度和高度比例。比如第一个字图width_ratios设置1,第二子图width_ratios设置2,那么第二个字图宽度比第一个多1倍。subplot_kw是一个存储了设置子图的各种关键字参数的字典,其中包含的关键字必须可以传递给Figure.add_subplot()方法的关键字。fig_kw是设置Figure对象的一些关键字参数。这些关键字参数也是可以传入到plt.figure()函数中。
fig, axs = plt.subplots( nrows=2, ncols=2, # 创建的Figure对象中绘制了2行2列的字图Axes对象 sharex=True, # 所有的Axes对象共享相同的X轴刻度 sharey="col", # 只有同列的Axes对象才共享相同的Y轴刻度 width_ratios=[1, 2], # 第2列的子图宽度是第一列的2倍 height_ratios=[2, 1], # 第1行的子图高度是第2行的2倍 subplot_kw={ # 会设置所有子图,如果所有子图的设置一致可以在这里统一设置 "title": "plot", # 所有子图的标题设置为plot,子图的标题一般不同,仅作演示 "xlabel": "x", # 所有子图的X轴标签设置x "ylabel": "y", # 所有子图的Y轴标签设置为y "alpha": 0.1, # 所有字图中透明度设置为0.1 # "frameon": False, #所有子图的边框取消 }, figsize=(8, 5), # 设置画板大小,默认大小6.4,4.8 dpi=300, # 设置图形分辨率为300,默认100 facecolor="#6cc6f3", # 设置背景颜色,默认值是white edgecolor="red", # Figure边框线颜色设置为红色,需要设置线宽才能显示出来 linewidth=1, # Figure边框线宽度 # frameon=False, # 禁止绘制图形框架,背景色图像边框都没有了,默认为True)axs[0, 0].plot(x, y) # 绘制第一行第一列的子图axs[0, 1].plot(x, x) # 绘制第一行第2列的字图plt.show()
