Python Matplotlib绘图库详解
文章目录
Matplotlib介绍与安装
Matplotlib 是 Python 的一个绘图库,它提供了一个类似于 MATLAB 的绘图系统。Matplotlib 是 Python 数据可视化领域的核心库之一,通过它,用户可以创建出版质量级别的图形图表。
Matplotlib 的主要功能
安装matplotlib
pip install matplotlib
导入
import matplotlib.pyplot as plt
Matplotlib 的默认配置都允许用户自定义。你可以调整大多数的默认配置:图片大小和分辨率(dpi)、线宽、颜色、风格、坐标轴、坐标轴以及网格的属性、文字与字体属性等。不过,matplotlib 的默认配置在大多数情况下已经做得足够好,你可能只在很少的情况下才会想更改这些默认配置。

基本绘图流程
第一部分主要作用是构建出一张空白的画布,并可以选择是否将整个画布划分为多个部分,方便在同一幅图上绘制多个图形的情况。最简单的绘图可以省 略第一部分,而后直接在默认的画布上进行图形绘制。
函数名称 | 函数作用 |
---|---|
plt.figure | 创建一个空白画布,可以指定画布大小,像素。 |
figure.add_subplot | 创建并选中子图,可以指定子图的行数,列数,与选中图片编号。 |
plt.figure方法绘图
import numpy as np
import matplotlib.pyplot as plt
# 创建画布
figure = plt.figure()
# 设置图表大小
plt.rcParams['figure.figsize'] = (8,6)
# 创建子图
plt.subplot()
# 绘制第1张子图:折线图
ax1 = plt.subplot(221)
plt.plot([1,2,3],[2,4,6])
# 绘制第2张子图:柱状图
ax2 = plt.subplot(222)
plt.bar([1,2,3],[2,4,6])
# 绘制第3张子图:散点图
ax3 = plt.subplot(223)
plt.scatter([1,3,5],[2,4,6])
# 绘制第4张子图:直方图
ax4 = plt.subplot(224)
plt.hist([2,2,2,3,4])
# 显示绘图
plt.show()
figure.add_subplot方法绘图
# 创建子图
fig, axes = plt.subplots(nrows=2,ncols=2,figsize=(10,8))
ax1,ax2,ax3,ax4 = axes.flatten()
# nrows表示行数,ncols表示列数,可以简写为 plt.subplots(2,2),figsize参数设置图表尺寸为1000×800像素。
ax1.plot([1,2,3],[2,4,6]) # 绘制第一张子图
ax2.bar([1,2,3],[2,4,6]) # 绘制第二张子图
ax3.scatter([1,3,5],[2,4,6]) # 绘制第三张子图
ax4.hist([2,2,2,3,4]) # 绘制第四张子图
# 显示绘图
plt.show()
2.添加画布内容
第二部分是绘图的主体部分。其中添加标题,坐标轴名称,绘制图形等步骤是并列的,没有先后顺序,可以先绘制图形,也可以先添加各类标签。但是添加图例一定要在绘制图形之后。
函数名称 | 函数作用 |
---|---|
plt.title | 在当前图形中添加标题,可以指定标题的名称、位置、颜色、字体 大小等参数。 |
plt.xlabel | 在当前图形中添加x轴名称,可以指定位置、颜色、字体大小等参数。 |
plt.ylabel | 在当前图形中添加y轴名称,可以指定位置、颜色、字体大小等参数。 |
plt.xlim | 指定当前图形x轴的范围,只能确定一个数值区间,而无法使用字符 串标识。 |
plt.ylim | 指定当前图形y轴的范围,只能确定一个数值区间,而无法使用字符 串标识。 |
plt.xticks | 指定x轴刻度的数目与取值。 |
plt.yticks | 指定y轴刻度的数目与取值。 |
plt.legend | 指定当前图形的图例,可以指定图例的大小、位置、标签。 |
函数名称 | 函数作用 |
---|---|
plt.savefig | 保存绘制的图片,可以指定图片的分辨率、边缘的颜色等参数。支持:eps, jpeg, jpg, pdf,pgf, png, ps, raw, rgba, svg, svgz, tif, tiff格式的图片,需要修改保存格式使用plt.rcParams[“savefig.format”]设置。 |
plt.show | 在本机显示图形。 |
pyplot模块使用rc配置文件来自定义图形的各种默认属性,称为rc配置或rc参数。通过修改rc参数可以修改默认的属性,包括窗体大小、每英寸的点数、线条宽度、颜色、样式、坐标轴、坐标和网络属性、文本、字体等。
matplotlib将默认参数配置保存在matplotlibrc文件中,通过修改配置文件,可修改图标的的缺省样式。
rc参数名称 | 解释 | 取值 |
---|---|---|
lines.linewidth | 线条宽度 | 取0-10之间的数值,默认为1.5。 |
lines.linestyle | 线条样式 | 可取“-”“–”“-.”“ : ”四种。 默认为“-” 。 |
lines.marker | 线条上点的形状 | 可取“o”“D”“h”“.”“ , ” “S”等20种,默认为None |
lines.markersize | 点的大小 | 取0-10之间的数值,默认为1。 |
# 修改rc参数
plt.rcParams['lines.linestyle'] = '-.'
plt.rcParams['lines.linewidth'] = 3
rc参数名称 | 解释 | 取值 |
---|---|---|
axes.facecolor | 背景颜色 | 接收颜色简写字符。默认为“W” |
axes.edgecolor | 边线颜色 | 接收颜色简写字符。默认为“k” |
axes.linewidth | 轴线宽度 | 接收0~1的float。默认为0.8 |
axes.grid | 添加网格 | 接收bool。默认为False |
axes.titlesize | 标题大小 | 接收‘small’,‘medium’,‘large’。默认为‘large’ |
axes.labelsize | 轴标大小 | 接收‘small’,‘medium’,‘large’。默认为‘medium’ |
axes.lablelcolor | 轴标颜色 | 接收颜色简写字符。默认为“k” |
axes.spines.{left,botton,top,tight} | 添加坐标轴 | 接收bool。默认为True |
axes.{x,y}margin | 轴余留 | 接收float。默认为0.05 |
rc参数名称 | 解释 | 取值 |
---|---|---|
font.family | 字体族,每一族对应多种字体 | 接收serif、sans-serif、cursive、fantasy、monospace五种。 |
font.style | 字体风格 | 接收normal(roman)、italic、oblique三种,默认为normal |
font.variant | 字体变化 | 接收normal或small-caps。默认为normal |
font.widget | 字体重量 | 接收normal、bold、bolder、lighter四种及100、200、…、900.默认为nomal |
font.stretch | 字体延伸 | |
font.size | 字体大小 | 接收float。默认为10 |
注意 !!!
由于默认的pyplot字体并不支持中文字符的显示,因此需要通过设置 font.sans-serif 参数改变绘图时的字体,使得
图形可以正常显示中文。同时,由于更改字体后,会导致 坐标轴中的部分字符无法显示,因此需要同时更改
axes.unicode_minus参数。
import matplotlib.pyplot as plt
# 用来正常显示中文标签,SimHei是黑体的英文名称
plt.rcParams['font.sans-serif'] = ['SimHei']
# 解决符号显示为方块的问题
plt.rcParams['axes.unicode_minus'] = False
基本绘图
# 绘制简单直线
import numpy as np
import matplotlib.pyplot as plt
# 绘制简单直线
x = np.array([1, 2, 3, 4, 5])
y = np.array([3, 6, 9, 12, 15])
# 绘制水平线、垂线
plt.axhline(y=6, ls=":", c="blue") # 添加水平直线
plt.axvline(x=4, ls="-", c="red") # 添加垂直直线
# 绘制多段垂线
plt.vlines([2, 3, 3.5], # 垂线的x坐标值
[10, 20, 30], # 每条垂线起始y坐标
[25, 35, 45]) # 每条垂线结束y坐标
plt.figure()
plt.plot(x, y)
plt.savefig('./test2.jpg') # 保存图片
plt.show() # 显示图片,阻塞方法
2.设置线型、线宽
linestyle: 设置线型,常见取值有实线(‘-’)、虚线(‘–’)、点虚线(‘-.’)、点线(‘:’)
linewidth:线宽
color:颜色(red, blue, green)
alpha: 设置透明度(0~1之间)
字符 | 描述 |
---|---|
‘-’ | 实线样式 |
‘–’ | 短横线样式 |
‘-.’ | 点划线样式 |
‘:’ | 虚线样式 |
‘.’ | 点标记 |
‘,’ | 像素标记 |
‘o’ | 圆标记 |
‘v’ | 倒三角标记 |
‘^’ | 正三角标记 |
‘<’ | 左三角标记 |
‘>’ | 右三角标记 |
‘1’ | 下箭头标记 |
‘2’ | 上箭头标记 |
‘3’ | 左箭头标记 |
‘4’ | 右箭头标记 |
‘s’ | 正方形标记 |
‘p’ | 五边形标记 |
‘*’ | 星形标记 |
‘h’ | 六边形标记 1 |
‘H’ | 六边形标记 2 |
‘+’ | 加号标记 |
‘x’ | X 标记 |
‘D’ | 菱形标记 |
‘d’ | 窄菱形标记 |
’ | ’ |
‘_’ | 水平线标记 |
字符 | 颜色 |
---|---|
‘b’ | 蓝色 |
‘g’ | 绿色 |
‘r’ | 红色 |
‘c’ | 青色 |
‘m’ | 品红色 |
‘y’ | 黄色 |
‘k’ | 黑色 |
‘w’ | 白色 |
示例:绘制正弦、余弦曲线,并设置线型、线宽、颜色、透明度
# 绘制正弦曲线
import numpy as np
import matplotlib.pyplot as plt
import math
# 以0.1为单位,生成0~6的数据
# np.pi 是NumPy库中定义的π(圆周率)的值,大约为3.141592653589793
x = np.arange(0, 2 * np.pi, 0.1) # 以0.1为单位,生成0~6的数据
print(x)
y1 = np.sin(x)
y2 = np.cos(x)
# 绘制图形
plt.plot(x, y1, label="sin", linewidth=2) # 实线,线宽2像素
plt.plot(x, y2, label="cos", linestyle="--", linewidth=4) # 虚线,线宽4像素
plt.xlabel("x") # x轴文字
plt.ylabel("y") # y轴文字
# 设置坐标轴范围
plt.xlim(0, 2 * math.pi)
plt.ylim(-1, 2)
plt.title("sin & cos") # 图标题
plt.legend() # 图例
plt.show()
3.设置坐标轴范围
#x_limt_min: <float> x轴范围最小值
#x_limit_max: <float> x轴范围最大值
plt.xlim(x_limt_min, x_limit_max)
#y_limt_min: <float> y轴范围最小值
#y_limit_max: <float> y轴范围最大值
plt.ylim(y_limt_min, y_limit_max)
4.设置坐标刻度
#x_val_list: x轴刻度值序列
#x_text_list: x轴刻度标签文本序列 [可选]
plt.xticks(x_val_list , x_text_list)
#y_val_list: y轴刻度值序列
#y_text_list: y轴刻度标签文本序列 [可选]
plt.yticks(y_val_list , y_text_list)
5.特殊点
# xarray: <序列> 所有需要标注点的水平坐标组成的序列
# yarray: <序列> 所有需要标注点的垂直坐标组成的序列
plt.scatter(xarray, yarray,
marker='', #点型 ~ matplotlib.markers
s= , #大小
edgecolor='', #边缘色
facecolor='', #填充色
zorder=3 #绘制图层编号 (编号越大,图层越靠上)
)
示例:绘制二次函数曲线,并在二次函数图像中添加特殊点
# 绘制二次函数曲线
import numpy as np
import matplotlib.pyplot as plt
import math
x = np.arange(-5, 5, 0.1) # 以0.1为单位,生成-5~5的数据
print(x)
y = x ** 2
# 绘制图形
plt.plot(x, y, label="$y = x ^ 2$",
linewidth=2, # 线宽2像素
color="red", # 颜色
alpha=0.5) # 透明度
plt.xlabel("x") # x轴文字
plt.ylabel("y") # y轴文字
# 设置坐标轴范围
plt.xlim(-10, 10)
plt.ylim(-1, 30)
# 设置刻度
x_tck = np.arange(-10, 10, 2)
x_txt = x_tck.astype("U")
plt.xticks(x_tck, x_txt)
y_tck = np.arange(-1, 30, 5)
y_txt = y_tck.astype("U")
plt.yticks(y_tck, y_txt)
# 绘制特殊点
plt.scatter(x_tck, # x坐标数组
x_tck ** 2, # y坐标数组
marker="s", # 点形状 s:square
s=40, # 大小
facecolor="blue", # 填充色
zorder=3) # 图层编号
plt.title("square") # 图标题
plt.legend(loc="upper right") # 图例 upper right, center
plt.show()
6.设置坐标轴
坐标轴名:left / right / bottom / top
# 获取当前坐标轴字典,{'left':左轴,'right':右轴,'bottom':下轴,'top':上轴 }
ax = plt.gca()
# 获取其中某个坐标轴
axis = ax.spines['坐标轴名']
# 设置坐标轴的位置。 该方法需要传入2个元素的元组作为参数
# type: <str> 移动坐标轴的参照类型 一般为'data' (以数据的值作为移动参照值)
# val: 参照值
axis.set_position(('data', val))
# 设置坐标轴的颜色
# color: <str> 颜色值字符串
axis.set_color(color)
# 设置坐标轴格式
import matplotlib.pyplot as plt
ax = plt.gca()
axis_b = ax.spines['bottom'] # 获取下轴
axis_b.set_position(('data', 0)) # 设置下轴位置, 以数据作为参照值
axis_l = ax.spines['left'] # 获取左轴
axis_l.set_position(('data', 0)) # 设置左轴位置, 以数据作为参照值
ax.spines['top'].set_color('none') # 设置顶部轴无色
ax.spines['right'].set_color('none') # 设置右部轴无色
plt.show()
7.图例
# 显示两条曲线的图例,并测试loc属性
# 再绘制曲线时定义曲线的label
# label: <关键字参数 str> 支持LaTex排版语法字符串
plt.plot(xarray, yarray ... label='', ...)
# 设置图例的位置
# loc: <关键字参数> 制定图例的显示位置 (若不设置loc,则显示默认位置)
# =============== =============
# Location String Location Code
# =============== =============
# 'best' 0
# 'upper right' 1
# 'upper left' 2
# 'lower left' 3
# 'lower right' 4
# 'right' 5
# 'center left' 6
# 'center right' 7
# 'lower center' 8
# 'upper center' 9
# 'center' 10
# =============== =============
plt.legend(loc='')
8.备注
# 在图表中为某个点添加备注。包含备注文本,备注箭头等图像的设置。
plt.annotate(
r'$\frac{\pi}{2}$', #备注中显示的文本内容
xycoords='data', #备注目标点所使用的坐标系(data表示数据坐标系)
xy=(x, y), #备注目标点的坐标
textcoords='offset points', #备注文本所使用的坐标系(offset points表示参照点的偏移坐标系)
xytext=(x, y), #备注文本的坐标
fontsize=14, #备注文本的字体大小
arrowprops=dict() #使用字典定义文本指向目标点的箭头样式
)
arrowprops参数使用字典定义指向目标点的箭头样式
#arrowprops字典参数的常用key
arrowprops=dict(
arrowstyle='', #定义箭头样式
connectionstyle='' #定义连接线的样式
)
箭头样式(arrowstyle)字符串如下
============ =============================================
Name Attrs
============ =============================================
'-' None
'->' head_length=0.4,head_width=0.2
'-[' widthB=1.0,lengthB=0.2,angleB=None
'|-|' widthA=1.0,widthB=1.0
'-|>' head_length=0.4,head_width=0.2
'<-' head_length=0.4,head_width=0.2
'<->' head_length=0.4,head_width=0.2
'<|-' head_length=0.4,head_width=0.2
'<|-|>' head_length=0.4,head_width=0.2
'fancy' head_length=0.4,head_width=0.4,tail_width=0.4
'simple' head_length=0.5,head_width=0.5,tail_width=0.2
'wedge' tail_width=0.3,shrink_factor=0.5
============ =============================================
连接线样式(connectionstyle)字符串如下
============ =============================================
Name Attrs
============ =============================================
'angle' angleA=90,angleB=0,rad=0.0
'angle3' angleA=90,angleB=0`
'arc' angleA=0,angleB=0,armA=None,armB=None,rad=0.0
'arc3' rad=0.0
'bar' armA=0.0,armB=0.0,fraction=0.3,angle=None
============ =============================================
示例:在二次函数图像中添加备注
# 将代码放到上面的二次函数中
# 设置备注
plt.annotate(
r'$y = x ^ 2$', #备注中显示的文本内容
xycoords='data', #备注目标点所使用的坐标系(data表示数据坐标系)
xy=(4, 16), #备注目标点的坐标 (4,16)
textcoords='offset points', #备注文本所使用的坐标系(offset points表示参照点的偏移坐标系)
xytext=(20, 30), #备注文本的坐标
fontsize=14, #备注文本的字体大小
arrowprops=dict(
arrowstyle="->", connectionstyle="angle3"
) #使用字典定义文本指向目标点的箭头样式
)
作者:张小生180