简介
matplotlib是一个python 2D绘图库,利用它可以画出许多高质量的图像。只需几行代码即可生成直方图,条形图,饼图,散点图等。
Matplotlib可用于Python脚本,Python和IPython shell,Jupyter笔记本,Web应用程序服务器和四个图形用户界面工具包。
Matplotlib,pyplot和pylab?
Matplotlib是整个包,pyplot是Matplotlib中的一个模块,并且pylab是一个安装在一起的模块。
pylab和pyplot的区别是,前者将numpy导入了其命名空间中,这样会使pylab表现的和matlab更加相似。现在来说我们经常使用pyplot,因为pyplot相比pylab更加纯粹。
numpy,pandas?
matplotlib是可视化的表达,那么在图形的绘制中肯定会涉及一些数据处理。pandas和numpy则是python中最好用的两个数据分析库,使用它们,能够解决超过90%的数据分析问题。
Matplotlib 绘图上手
如果你还没有安装 Python 环境,那么推荐你安装 Anaconda,对于上手 Python 来说更加简单,不容易出差错。Anaconda 的安装教程网上很多,找到对应版本客户端安装即可。安装好后,即可在终端(cmd)安装核心库 Matplotlib。
1. 安装快速入门
方式一 使用 pip 安装:
pip install matplotlib
方式二 使用 conda 安装:
conda install matplotlib
或者
conda install -c conda-forge matplot
2. 绘制第一个图
下面是一个最小的示例图:
Matplotlib 绘图我看到的一般是两种方式
方式一
依靠 pyplot 隐式创建和管理图形和轴,以及 使用 pyplot 函数进行绘图
直接使用 matplotlib.pyplot.plot()函数绘图
这里在matplotlib.pyplot.plot()括号中直接输入x,y,线形,色彩,图例等信息
例如:
import matplotlib.pyplot as plt
import numpy as np
import math
x = np.arange(-2*math.pi, 2*math.pi, 0.001)
y = np.sin(x)
plt.plot(x, #x轴值
y, #y轴值
)
plt.show()
其中,可设置的参数有很多,除了x,y轴的信息,还可包含以下信息
- linewidth: 线条的宽度,从0到无穷大的浮点数,例如2.5
- color: 线条的颜色,可以是字符串、元组或RGBA值,代表不同的颜色。例如:红色’red’、绿色’green’等
- linestyle: 线条的样式,可以是字符串,如实线’-‘、虚线’–‘、点线’:‘、破折线’-.'等
- marker: 数据点的标记样式,如 ‘.’: 小圆点、‘o’: 实心圆、‘>’: 右三角形
- markersize: 标记的大小,从0到无穷大的浮点数,例如7.5
- label: 字符串类型,代表绘制的线条的标签,在图例中显示。例如Line 1
- alpha: 线条和标记的透明度,从0到1的浮点数,表示线条和标记的透明度。例如0.5
- zorder: 整数类型,表示绘图的层数,数值越大越靠上。例如2
除了这些常用参数外,还有其他一些参数可以进一步定制化图形,例如: - solid_capstyle: 实线端点的样式,如普通平直样式"butt"、圆角样式"round"、斜角样式"projecting"等
- dash_capstyle: 虚线端点的样式,与solid_capstyle类似 dash_joinstyle:
- 虚线连接处的样式,如圆弧连接"round"、斜接连接"bevel"、锐角连接"miter"等 solid_joinstyle:
- 实线连接处的样式,与dash_joinstyle类似 markevery:
- 标记显示的间隔,可以是数字、元组或者函数,可以是数字、元组或者函数。例如:每隔一个数据点标记一个 点:markevery=2;从第二个开始,每个5个数据点标记一个点:markevery=(1, 5);根据某个函数的返回值来控制标记的位置:markevery=lambda i: i%3==0
当多个图叠加时
import matplotlib.pyplot as plt
import numpy as np
import math
x = np.arange(-2*math.pi, 2*math.pi, 0.001)
y1 = np.sin(x)
y2 = np.cos(x)
plt.plot(x, #x轴值
y1, #y轴值
)
plt.plot(x, #x轴值
y2, #y轴值
)
plt.show()
matplotlib.pyplot.plot()括号中可设置的参数非常多,后面会有详尽版的文档供大家参考
拿上图举例,设置一下
import matplotlib.pyplot as plt
import numpy as np
import math
#设置全局字体
plt.rcParams['font.family']= 'sans-serif'
plt.rcParams['font.sans-serif'] ='Times New Roman'
x = np.arange(-2*math.pi, 2*math.pi, 0.1)
y1 = np.sin(x)
y2 = np.cos(x)
plt.plot(x, #x轴值
y1, #y轴值
linestyle='-.', # 线型
linewidth=3, # 线条宽度
color='red', # 颜色
label=r'$y1 = sin(x)$' # 图例
)
plt.plot(x, #x轴值
y2, #y轴值
'<', # 散点形状
markersize=5, # 散点大小
markerfacecolor='blue', # 散点内部颜色
markeredgecolor='gray', # 散点边缘颜色
label=r'$y2 = cos(x)$' # 图例
)
plt.title("This is Title", #设置标题
fontsize=30, #标题大小
loc='center', #标题位置
color='purple', #标题颜色
fontname='DejaVu Serif' #单独设置字体类型
)
plt.xlabel('x',fontsize=20,color='k') #x轴标签
plt.ylabel('y',fontsize=20,color='k') #y轴标签
plt.legend(loc='best') #图例位置
plt.show()
多子图绘制
使用plt.figure()创建画布,然后使用fig.add_subplot来画出每个子图。
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(-2*np.pi, 2* np.pi, 0.1)
y1 = np.sin(x)
y2 = np.cos(x)
# 创建画布
fig = plt.figure()
# 绘制第一个子图
fig1 = fig.add_subplot(2, 1, 1)
# 这里用 211 或者 2,1,1 都可以。
# 第一个数字指定要创建具有几行子图的规格,第二个数字指列数的规格,第三个数字指对全部子图的行列从左往右,从上往下的第几个子图
fig1.grid(True)#是否绘制网格线
fig1.plot(x, #x轴值
y1, #y轴值
linestyle='-.', # 线型
linewidth=3, # 线条宽度
color='red', # 颜色
label=r'$y1 = sin(x)$' # 图例
)
fig1.set_title('Fig1')
# 绘制第二个子图
fig2 = fig.add_subplot(2, 1, 2)
fig2.grid(False)
fig2.plot(x, #x轴值
y2, #y轴值
'<', # 散点形状
markersize=5, # 散点大小
markerfacecolor='blue', # 散点内部颜色
markeredgecolor='gray', # 散点边缘颜色
label=r'$y2 = cos(x)$' # 图例
)
fig2.set_title('Fig2')
plt.show()# 显示图像
方式二
显式创建图形和轴,并对其调用方法( “面向对象 (OO) 样式”)。
使用 plt.subplot() 函数用于直接制定划分方式和位置进行绘图
这种一般适合画组图,比如3乘2的组图
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 2 * np.pi, 200)
y = np.sin(x)
fig, ax = plt.subplots()
ax.plot(x, y)
plt.show()
组图形式
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 2 * np.pi, 200)
y1 = np.sin(x)
y2 = np.cos(x)
fig, (ax1,ax2) = plt.subplots(1,2,figsize=(10, 5)) #一行两列的图,图的大小为行为10,列为5
ax1.plot(x, y1)
ax2.plot(x, y2)
plt.show()
复杂详尽一点的例子
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-2 * np.pi, 2 * np.pi, 100)
y1 = np.sin(x)
y2 = np.cos(x)
fig, (ax1,ax2) = plt.subplots(1,2,figsize=(10, 5))
ax1.plot(x, y1, label=r'$y1 = sin(x)$',linewidth=3,linestyle='-.') # 图例
ax1.plot(x, y2, label=r'$y1 = cos(x)$',linewidth=3,linestyle='-') # 图例
ax1.set_xlabel('x label')
ax1.set_ylabel('y label')
ax1.set_title("Simple Plot Sin(x)")
ax1.legend(loc='best')#图例位置
ax2.plot(x, y2, '*' ,label=r'$y2 = cos(x)$')
ax2.set_title("Simple Plot Cos(x)")
ax2.set_xlabel('x label')
ax2.set_ylabel('y label')
ax2.legend(loc='best')#图例位置
plt.show()
Matplotlib的文档和示例同时使用OO和pyplot 风格。通常,我们建议使用 OO 样式,特别是对于 复杂的绘图,以及旨在重用的函数和脚本 作为更大项目的一部分。但是,pyplot样式可以非常方便 用于快速交互式工作。
3. 图片的保存
使用plt.savefig来保存图像
plt.savefig('xx.png', dpi=300)
plt.savefig()的第一个参数是fname,也就是要保存图片的路径,在路径里输入什么后缀,图片就会自动存成什么后缀,比如这里就保存成了png格式;dpi为分辨率,分辨率越高,图片越清晰。
4. 更多
以上图片来自matplotlib官网,它向我们展示了matplotlib的图的构成元素。
大多数元素都比较好理解:
坐标轴(axis)、坐标轴名称(axis label)、坐标轴刻度(tick)、坐标轴刻度标签(tick label)、网格线(grid)、图例(legend)、标题(title)…
写在最后
本文粗浅的描述了Matplotlib绘图的方法以及各个参数信息
更多内容可参考Matplotlib官网说明
后续将针对上述两种绘图方式出详尽版的文档
具体统计各个参数所包含的内容,敬请期待