文章目录
Matplotlib介绍与安装
Matplotlib 是 Python 的一个绘图库,它提供了一个类似于 MATLAB 的绘图系统。Matplotlib 是 Python 数据可视化领域的核心库之一,通过它,用户可以创建出版质量级别的图形图表。
-
Matplotlib 的主要功能
- 二维图形的绘制:支持绘制线图、散点图、柱状图、饼图、箱型图、误差线图、热力图、等高线图等几乎所有常见的二维图形。
- 三维图形的绘制:通过 Matplotlib 的子库 mpl_toolkits.mplot3d,用户可以绘制三维图形,如三维曲面图、三维散点图等。
- 图形的定制:提供丰富的API,允许用户对图形的各种元素(如线条、标记、字体、图例、坐标轴等)进行精细定制。
- 交互式图形:通过结合 IPython、Jupyter Notebook 或其他交互式环境,用户可以实时查看并修改图形的参数。
- 图形的保存:支持将图形保存为多种格式的文件,如 PNG、PDF、SVG 等。
-
安装matplotlib
pythonpip install matplotlib
-
导入
pythonimport matplotlib.pyplot as plt
Matplotlib 的默认配置都允许用户自定义。你可以调整大多数的默认配置:图片大小和分辨率(dpi)、线宽、颜色、风格、坐标轴、坐标轴以及网格的属性、文字与字体属性等。不过,matplotlib 的默认配置在大多数情况下已经做得足够好,你可能只在很少的情况下才会想更改这些默认配置。
- 图表的构成
基本绘图流程
- 1.创建画布与创建子图
第一部分主要作用是构建出一张空白的画布,并可以选择是否将整个画布划分为多个部分,方便在同一幅图上绘制多个图形的情况。最简单的绘图可以省 略第一部分,而后直接在默认的画布上进行图形绘制。
函数名称 | 函数作用 |
---|---|
plt.figure | 创建一个空白画布,可以指定画布大小,像素。 |
figure.add_subplot | 创建并选中子图,可以指定子图的行数,列数,与选中图片编号。 |
-
plt.figure方法绘图
pythonimport 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方法绘图
python# 创建子图 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 | 指定当前图形的图例,可以指定图例的大小、位置、标签。 |
- 3.保存与展示图形
函数名称 | 函数作用 |
---|---|
plt.savefig | 保存绘制的图片,可以指定图片的分辨率、边缘的颜色等参数。支持:eps, jpeg, jpg, pdf,pgf, png, ps, raw, rgba, svg, svgz, tif, tiff格式的图片,需要修改保存格式使用plt.rcParams["savefig.format"]设置。 |
plt.show | 在本机显示图形。 |
- 4.设置pyplot的动态rc参数
-
pyplot模块使用rc配置文件来自定义图形的各种默认属性,称为rc配置或rc参数。通过修改rc参数可以修改默认的属性,包括窗体大小、每英寸的点数、线条宽度、颜色、样式、坐标轴、坐标和网络属性、文本、字体等。
-
matplotlib将默认参数配置保存在matplotlibrc文件中,通过修改配置文件,可修改图标的的缺省样式。
- 1.线条常用的rc参数
rc参数名称 解释 取值 lines.linewidth 线条宽度 取0-10之间的数值,默认为1.5。 lines.linestyle 线条样式 可取"-""--""-."" : "四种。 默认为"-" 。 lines.marker 线条上点的形状 可取"o""D""h""."" , " "S"等20种,默认为None lines.markersize 点的大小 取0-10之间的数值,默认为1。 python# 修改rc参数 plt.rcParams['lines.linestyle'] = '-.' plt.rcParams['lines.linewidth'] = 3
- 2.坐标轴常用的rc参数
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 - 3.字体常用的rc参数
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参数。
pythonimport matplotlib.pyplot as plt # 用来正常显示中文标签,SimHei是黑体的英文名称 plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决符号显示为方块的问题 plt.rcParams['axes.unicode_minus'] = False
-
基本绘图
- 1.绘图核心API
python
# 绘制简单直线
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' 白色 -
示例:绘制正弦、余弦曲线,并设置线型、线宽、颜色、透明度
python# 绘制正弦曲线 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.设置坐标轴范围
python#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.设置坐标刻度
python#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.特殊点
python# xarray: <序列> 所有需要标注点的水平坐标组成的序列 # yarray: <序列> 所有需要标注点的垂直坐标组成的序列 plt.scatter(xarray, yarray, marker='', #点型 ~ matplotlib.markers s= , #大小 edgecolor='', #边缘色 facecolor='', #填充色 zorder=3 #绘制图层编号 (编号越大,图层越靠上) )
-
示例:绘制二次函数曲线,并在二次函数图像中添加特殊点
python# 绘制二次函数曲线 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
python# 获取当前坐标轴字典,{'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)
python# 设置坐标轴格式 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.图例
python# 显示两条曲线的图例,并测试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.备注
python# 在图表中为某个点添加备注。包含备注文本,备注箭头等图像的设置。 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参数使用字典定义指向目标点的箭头样式
python#arrowprops字典参数的常用key arrowprops=dict( arrowstyle='', #定义箭头样式 connectionstyle='' #定义连接线的样式 )
箭头样式(arrowstyle)字符串如下
python============ ============================================= 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)字符串如下
python============ ============================================= 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 ============ =============================================
示例:在二次函数图像中添加备注
python# 将代码放到上面的二次函数中 # 设置备注 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" ) #使用字典定义文本指向目标点的箭头样式 )