1.设置线型、线宽和颜色
import numpy as np import matplotlib.pyplot as mp # xarray: <序列> 水平坐标序列 # yarray: <序列> 垂直坐标序列 mp.plot(xarray, yarray) #显示图表 mp.show()
(1)绘画折线图,水平线/垂直线
import numpy as np import matplotlib.pyplot as mp # vertical 绘制垂直线 mp.vlines(vval, ymin, ymax)#列的位置,起点坐标y,终点坐标y # horizotal 绘制水平线 mp.hlines(xval, xmin, xmax)#行的位置,起点坐标x,终点坐标x #显示图表 mp.show()
#基本绘图 import numpy as np import matplotlib.pyplot as mp xarray = np.arange(8) yarray = np.array([64,89,12,36,49,80,45,34]) #绘制折线图 mp.plot(xarray,yarray) #绘制水平线 mp.hlines(40,1,7) # mp.hlines([10,20,30,50],1,7) mp.hlines([10,20,30,50],[1,2,4,5],[7,5,4,3])#行的位置 起点位置 终点位置 #绘制垂直线 mp.vlines(4,20,80) mp.show()
(2)画一条正弦曲线,余弦曲线
#linestyle: 线型 "-" "--" ":" ".-" #linewidth: 线宽 # 数字 #color: <关键字参数> 颜色 # 英文颜色单词 或 常见颜色英文单词首字母 或 #495434 或 (1,1,1) 或 (1,1,1,1) #alpha: <关键字参数> 透明度 # 浮点数值 mp.plot(xarray, yarray, linestyle=\'\', linewidth=1, color=\'\', alpha=0.5)
import numpy as np import matplotlib.pyplot as mp # 绘制正弦曲线 y=sin(x) x = np.linspace(-np.pi, np.pi, 1000) sinx = np.sin(x) # 绘制余弦曲线 y=cos(x) / 2 cosx = np.cos(x) / 2 mp.plot(x, sinx) mp.plot(x, cosx) mp.show()
2.设置坐标轴范围
#x_limt_min: <float> x轴范围最小值 #x_limit_max: <float> x轴范围最大值 mp.xlim(x_limt_min, x_limit_max) #y_limt_min: <float> y轴范围最小值 #y_limit_max: <float> y轴范围最大值 mp.ylim(y_limt_min, y_limit_max)
import numpy as np import matplotlib.pyplot as mp # 绘制正弦曲线 y=sin(x) x = np.linspace(-np.pi, np.pi, 1000) sinx = np.sin(x) # 绘制余弦曲线 y=cos(x) / 2 cosx = np.cos(x) / 2 #设置可视区间 mp.xlim(0, np.pi+0.1) mp.ylim(0, 1+0.1) mp.plot(x, sinx) mp.plot(x, cosx) mp.show()
3.设置坐标刻度
#x_val_list: x轴刻度值序列 #x_text_list: x轴刻度标签文本序列 [可选] mp.xticks(x_val_list , x_text_list ) #y_val_list: y轴刻度值序列 #y_text_list: y轴刻度标签文本序列 [可选] mp.yticks(y_val_list , y_text_list )
案例:把横坐标的刻度显示为:0, π/2, π, 3π/2, 2π
import numpy as np import matplotlib.pyplot as mp # 绘制正弦曲线 y=sin(x) x = np.linspace(-np.pi, np.pi, 1000) sinx = np.sin(x) # 绘制余弦曲线 y=cos(x) / 2 cosx = np.cos(x) / 2 # 设置刻度文本 vals = [-np.pi, -np.pi/2, 0, np.pi/2, np.pi] texts = [r\'$-\pi$\', r\'$-\frac{\pi}{2}$\', 0, r\'$\frac{\pi}{2}$\', r\'$\pi$\'] mp.xticks(vals, texts) mp.yticks([-1.0, -0.5, 0.5, 1]) mp.plot(x, sinx) mp.plot(x, cosx) mp.show()
4.设置坐标轴
坐标轴名:left / right / bottom / top
# 获取当前坐标轴字典,{\'left\':左轴,\'right\':右轴,\'bottom\':下轴,\'top\':上轴 } ax = mp.gca() # 获取其中某个坐标轴 axis = ax.spines[\'坐标轴名\'] # 设置坐标轴的位置。 该方法需要传入2个元素的元组作为参数 # type: <str> 移动坐标轴的参照类型 一般为\'data\' (以数据的值作为移动参照值) # val: 参照值 axis.set_position((\'data\', val)) # 设置坐标轴的颜色 # color: <str> 颜色值字符串 axis.set_color(color)
案例:设置坐标轴至中心。
#设置坐标轴 ax = mp.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\')
import numpy as np import matplotlib.pyplot as mp # 绘制正弦曲线 y=sin(x) x = np.linspace(-np.pi, np.pi, 1000) sinx = np.sin(x) # 绘制余弦曲线 y=cos(x) / 2 cosx = np.cos(x) / 2 # 设置刻度文本 vals = [-np.pi, -np.pi/2, 0, np.pi/2, np.pi] texts = [r\'$-\pi$\', r\'$-\frac{\pi}{2}$\', 0, r\'$\frac{\pi}{2}$\', r\'$\pi$\'] mp.xticks(vals, texts) mp.yticks([-1.0, -0.5, 0.5, 1]) # 设置坐标轴(移动) axis = mp.gca() axis.spines[\'top\'].set_color(\'none\') axis.spines[\'right\'].set_color(\'none\') axis.spines[\'left\'].set_position((\'data\', 0)) axis.spines[\'bottom\'].set_position((\'data\', 0)) mp.plot(x, sinx) mp.plot(x, cosx) mp.show()
5.图例
显示两条曲线的图例,并测试loc属性。
# 再绘制曲线时定义曲线的label # label: <关键字参数 str> 支持LaTex排版语法字符串 mp.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 # =============== ============= mp.legend(loc=\'\')
import numpy as np import matplotlib.pyplot as mp # 绘制正弦曲线 y=sin(x) x = np.linspace(-np.pi, np.pi, 1000) sinx = np.sin(x) # 绘制余弦曲线 y=cos(x) / 2 cosx = np.cos(x) / 2 # 设置刻度文本 vals = [-np.pi, -np.pi/2, 0, np.pi/2, np.pi] texts = [r\'$-\pi$\', r\'$-\frac{\pi}{2}$\', 0, r\'$\frac{\pi}{2}$\', r\'$\pi$\'] mp.xticks(vals, texts) mp.yticks([-1.0, -0.5, 0.5, 1]) # 设置坐标轴(移动) axis = mp.gca() axis.spines[\'top\'].set_color(\'none\') axis.spines[\'right\'].set_color(\'none\') axis.spines[\'left\'].set_position((\'data\', 0)) axis.spines[\'bottom\'].set_position((\'data\', 0)) mp.plot(x, sinx, linestyle=\'--\', linewidth=2, color=\'dodgerblue\', alpha=0.8, label=r\'$y=sin(x)$\') mp.plot(x, cosx, linestyle=\'-.\', linewidth=2, color=\'orangered\', alpha=0.8, label=r\'$y=\frac{1}{2}cos(x)$\') mp.show()
6.特殊点
# xarray: <序列> 所有需要标注点的水平坐标组成的序列 # yarray: <序列> 所有需要标注点的垂直坐标组成的序列 mp.scatter(xarray, yarray, marker=\'\', #点型 ~ matplotlib.markers s=50, #大小 edgecolor=\'\', #边缘色 facecolor=\'\', #填充色 zorder=3 #绘制图层编号 (编号越大,图层越靠上)
案例:绘制当x=π/2时两条曲线上的特殊点。
import numpy as np import matplotlib.pyplot as mp # 绘制正弦曲线 y=sin(x) x = np.linspace(-np.pi, np.pi, 1000) sinx = np.sin(x) # 绘制余弦曲线 y=cos(x) / 2 cosx = np.cos(x) / 2 # 设置刻度文本 vals = [-np.pi, -np.pi/2, 0, np.pi/2, np.pi] texts = [r\'$-\pi$\', r\'$-\frac{\pi}{2}$\', 0, r\'$\frac{\pi}{2}$\', r\'$\pi$\'] mp.xticks(vals, texts) mp.yticks([-1.0, -0.5, 0.5, 1]) # 设置坐标轴(移动) axis = mp.gca() axis.spines[\'top\'].set_color(\'none\') axis.spines[\'right\'].set_color(\'none\') axis.spines[\'left\'].set_position((\'data\', 0)) axis.spines[\'bottom\'].set_position((\'data\', 0)) mp.plot(x, sinx, linestyle=\'--\', linewidth=2, color=\'dodgerblue\', alpha=0.8, label=r\'$y=sin(x)$\') mp.plot(x, cosx, linestyle=\'-.\', linewidth=2, color=\'orangered\', alpha=0.8, label=r\'$y=\frac{1}{2}cos(x)$\') # 绘制特殊点 xs = [np.pi/2, np.pi/2] ys = [1, 0] mp.scatter(xs, ys, marker=\'o\', edgecolor=\'red\', facecolor=\'green\', s=100, label=\'Points\', zorder=3) mp.show()
7.备注
# 在图表中为某个点添加备注。包含备注文本,备注箭头等图像的设置。 mp.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 ============ =============================================
案例:为在某条曲线上的点添加备注,指明函数方程与值。
import numpy as np import matplotlib.pyplot as mp # 绘制正弦曲线 y=sin(x) x = np.linspace(-np.pi, np.pi, 1000) sinx = np.sin(x) # 绘制余弦曲线 y=cos(x) / 2 cosx = np.cos(x) / 2 #设置可视区间 # mp.xlim(0, np.pi+0.1) # mp.ylim(0, 1+0.1) # 设置刻度文本 vals = [-np.pi, -np.pi/2, 0, np.pi/2, np.pi] texts = [r\'$-\pi$\', r\'$-\frac{\pi}{2}$\', 0, r\'$\frac{\pi}{2}$\', r\'$\pi$\'] mp.xticks(vals, texts) mp.yticks([-1.0, -0.5, 0.5, 1]) # 移动坐标轴 axis = mp.gca() axis.spines[\'top\'].set_color(\'none\') axis.spines[\'right\'].set_color(\'none\') axis.spines[\'left\'].set_position((\'data\', 0)) axis.spines[\'bottom\'].set_position((\'data\', 0)) mp.plot(x, sinx, linestyle=\'--\', linewidth=2, color=\'dodgerblue\', alpha=0.8, label=r\'$y=sin(x)$\') mp.plot(x, cosx, linestyle=\'-.\', linewidth=2, color=\'orangered\', alpha=0.8, label=r\'$y=\frac{1}{2}cos(x)$\') # 绘制特殊点 xs = [np.pi/2, np.pi/2] ys = [1, 0] mp.scatter(xs, ys, marker=\'o\', edgecolor=\'red\', facecolor=\'green\', s=100, label=\'Points\', zorder=3) # 添加备注信息 mp.annotate(r\'$[\frac{\pi}{2},1]$\', xycoords=\'data\', xy=(np.pi / 2, 1), textcoords=\'offset points\', xytext=(30, 30), fontsize=14, arrowprops=dict( arrowstyle=\'->\', connectionstyle=\'angle3\')) mp.annotate(r\'$[\frac{\pi}{2},0]$\', # 备注的内容 xycoords=\'data\', # 会让你的箭头指向这个点 xy=(np.pi / 2, 0), # 备注的坐标点 textcoords=\'offset points\', # 你传进去的那个字符串会基于你第一步画出来的那个点的基础上x轴上减30,y轴上减30的位置进行打印。 xytext=(-60, -60), # 离原坐标的距离 fontsize=14, # 备注字的大小 arrowprops=dict( arrowstyle=\'->\', # 描绘了箭头的样式 connectionstyle=\'angle3\')) # 就是描绘箭头的样式的,例如箭头的一个弧度之类的 mp.legend(loc=\'best\') mp.show()
(二)图形对象(图形窗口)
案例:绘制两个窗口,一起显示。
# 手动构建 matplotlib 窗口 mp.figure( \'A\', #窗口标题栏文本 facecolor=\'\' #图表背景色 ) mp.figure(\'B\') mp.figure(\'A\') # 把A创建置为当前窗口 mp.plot(....) # 将会作用在A窗口中 mp.show()
import matplotlib.pyplot as mp # 为figureA添加图形 mp.figure(\'Figure A\', facecolor=\'gray\') mp.title(\'Figure A\') # 为figureB添加图形 mp.figure(\'Figure B\', facecolor=\'lightgray\') mp.title(\'Figure B\') mp.tight_layout()#紧凑布局 mp.show()
mp.figure方法不仅可以构建一个新窗口,如果已经构建过title=\'xxx\'的窗口,又使用figure方法构建了title=\'xxx\' 的窗口的话,mp将不会创建新的窗口,而是把title=\'xxx\'的窗口置为当前操作窗口。
设置当前窗口的参数
案例:测试窗口相关参数
# 设置图表标题 显示在图表上方 mp.title(title, fontsize=12) # 设置水平轴的文本 mp.xlabel(x_label_str, fontsize=12) # 设置垂直轴的文本 mp.ylabel(y_label_str, fontsize=12) # 设置刻度参数 labelsize设置刻度字体大小 mp.tick_params(labelsize=8) # 设置图表网格线 linestyle设置网格线的样式 # - or solid 粗线 # -- or dashed 虚线 # -. or dashdot 点虚线 # : or dotted 点线 mp.grid(linestyle=\'\') # 设置紧凑布局,把图表相关参数都显示在窗口中 mp.tight_layout()
import numpy as np import matplotlib.pyplot as mp # 为figureA添加图形 mp.figure(\'Figure A\', facecolor=\'gray\') mp.title(\'Figure A\') # 为figureB添加图形 mp.figure(\'Figure B\', facecolor=\'lightgray\') mp.title(\'Figure B\') # 把FigureA 置为当前窗口 mp.figure(\'Figure A\') mp.title(\'Figure A\', fontsize=18) mp.tick_params(labelsize=14) mp.xlabel(\'X\', fontsize=16) mp.xlabel(\'Y\', fontsize=16) mp.grid(linestyle=":") mp.tight_layout()#紧凑布局 mp.show()
1.子图
import matplotlib.pyplot as mp mp.figure(\'Subplot\', facecolor=\'lightgray\') for i in range(1, 10): mp.subplot(3, 3, i) mp.text(0.5, 0.5, i, ha="center", va=\'center\', size=36, alpha=0.8) mp.xticks([]) mp.yticks([]) mp.tight_layout() mp.show()
网络式布局
# 网格式布局 import matplotlib.gridspec as mg import matplotlib.pyplot as mp mp.figure(\'Grid Layout\', facecolor=\'lightgray\') mp.title(\'Grid Layout\') gs = mg.GridSpec(3, 3) # 1 mp.subplot(gs[0, :2]) mp.text(0.5, 0.5, 1, size=36, alpha=0.7, ha=\'center\', va=\'center\') mp.xticks([]) mp.yticks([]) # 2 mp.subplot(gs[0:2, -1]) mp.text(0.5, 0.5, 2, size=36, alpha=0.7, ha=\'center\', va=\'center\') mp.xticks([]) mp.yticks([]) # 3 mp.subplot(gs[1:3, 0]) mp.text(0.5, 0.5, 3, size=36, alpha=0.7, ha=\'center\', va=\'center\') mp.xticks([]) mp.yticks([]) # 4 mp.subplot(gs[1, 1]) mp.text(0.5, 0.5, 4, size=36, alpha=0.7, ha=\'center\', va=\'center\') mp.xticks([]) mp.yticks([]) # 5 mp.subplot(gs[2, 1:3]) mp.text(0.5, 0.5, 5, size=36, alpha=0.7, ha=\'center\', va=\'center\') mp.xticks([]) mp.yticks([]) mp.tight_layout() mp.show()
自由式布局
#自由布局 import matplotlib.pyplot as mp mp.figure(\'Free Style\',facecolor=\'lightgray\') mp.axes([0.1,0.1,0.2,0.5])#x左底部,y左底部,宽度,高度 mp.text(0.5, 0.5, 1, ha=\'center\', va=\'center\', size=36) mp.xticks([]) mp.yticks([]) mp.axes([0.4,0.1,0.5,0.2]) mp.text(0.5, 0.5, 2, ha=\'center\', va=\'center\', size=36) mp.xticks([]) mp.yticks([]) mp.axes([0.1,0.7,0.5,0.2]) mp.text(0.5, 0.5, 3, ha=\'center\', va=\'center\', size=36) mp.xticks([]) mp.yticks([]) mp.axes([0.7,0.4,0.2,0.5]) mp.text(0.5, 0.5, 4, ha=\'center\', va=\'center\', size=36) mp.xticks([]) mp.yticks([]) mp.axes([0.4,0.4,0.2,0.2]) mp.xticks([]) mp.yticks([]) mp.text(0.5, 0.5, 5, ha=\'center\', va=\'center\', size=36) mp.show()
2.刻度定位器
# 获取当前坐标轴 ax = mp.gca() # 设置水平坐标轴的主刻度定位器 ax.xaxis.set_major_locator(mp.NullLocator()) # 设置水平坐标轴的次刻度定位器为多点定位器,间隔0.1 ax.xaxis.set_minor_locator(mp.MultipleLocator(0.1))
案例:绘制一个数轴。
import matplotlib.pyplot as mp # 刻度定位器 mp.figure(\'Locator\', facecolor=\'lightgray\') axis = mp.gca() axis.spines[\'top\'].set_color(\'none\') axis.spines[\'right\'].set_color(\'none\') axis.spines[\'left\'].set_color(\'none\') mp.xlim(0, 10) mp.ylim(-1, 1) mp.yticks([]) axis.spines[\'bottom\'].set_position((\'data\', 0)) maj_loc = mp.MultipleLocator(1) # 每隔1一个刻度 axis.xaxis.set_major_locator(maj_loc) min_loc = mp.MultipleLocator(0.1) # 每隔0.1一个刻度 axis.xaxis.set_minor_locator(min_loc) mp.tight_layout() mp.show()
案例:使用for循环测试刻度器样式
import matplotlib.pyplot as mp locators = [\'mp.NullLocator()\', \'mp.MaxNLocator(nbins=4)\', \'mp.AutoLocator()\', \'mp.FixedLocator([2.5,5,7.5,10])\'] # 刻度定位器 mp.figure(\'Locator\', facecolor=\'lightgray\') for i, locator in enumerate(locators): mp.subplot(len(locators), 1, i+1) # rows:行数 cols:列数 num:编号 axis = mp.gca() axis.spines[\'top\'].set_color(\'none\') axis.spines[\'right\'].set_color(\'none\') axis.spines[\'left\'].set_color(\'none\') mp.xlim(0, 10) mp.ylim(-1, 1) mp.yticks([]) # axis.spines[\'bottom\'].set_position((\'data\', 0)) maj_loc = eval(locator) # mp.MultipleLocator(1) # 每隔1一个刻度 axis.xaxis.set_major_locator(maj_loc) min_loc = mp.MultipleLocator(0.1) # 每隔0.1一个刻度 axis.xaxis.set_minor_locator(min_loc) mp.tight_layout() mp.show()
常用刻度器如下
# 空定位器:不绘制刻度 mp.NullLocator() # 最大值定位器: # 最多绘制nbins+1个刻度 mp.MaxNLocator(nbins=3) # 定点定位器:根据locs参数中的位置绘制刻度 mp.FixedLocator(locs=[0, 2.5, 5, 7.5, 10]) # 自动定位器:由系统自动选择刻度的绘制位置 mp.AutoLocator() # 索引定位器:由offset确定起始刻度,由base确定相邻刻度的间隔 mp.IndexLocator(offset=0.5, base=1.5) # 多点定位器:从0开始,按照参数指定的间隔(缺省1)绘制刻度 mp.MultipleLocator() # 线性定位器:等分numticks-1份,绘制numticks个刻度 mp.LinearLocator(numticks=21) # 对数定位器:以base为底,绘制刻度 mp.LogLocator(base=2)
3.刻度网格线
ax = mp.gca() #绘制刻度网格线 ax.grid( which=\'\', # \'major\'/\'minor\' <-> \'主刻度\'/\'次刻度\' axis=\'\', # \'x\'/\'y\'/\'both\' <-> 绘制x或y轴 linewidth=1, # 线宽 linestyle=\'\', # 线型 color=\'\', # 颜色 alpha=0.5 # 透明度 )
案例:绘制曲线 [1, 10, 100, 1000, 100, 10, 1],然后设置刻度网格线,测试刻度网格线的参数。
import matplotlib.pyplot as mp y = [1, 10, 100, 2000, 100, 10, 1] mp.figure(\'GridLine\', facecolor=\'lightgray\') mp.title(\'GridLine\') ax = mp.gca() ma_loc = mp.MultipleLocator(1) ax.xaxis.set_major_locator(ma_loc) mi_loc = mp.MultipleLocator(0.1) ax.xaxis.set_minor_locator(mi_loc) ma_loc = mp.MultipleLocator(250) ax.yaxis.set_major_locator(ma_loc) mi_loc = mp.MultipleLocator(50) ax.yaxis.set_minor_locator(mi_loc) # 绘制刻度网格线 ax.grid(which=\'major\', axis=\'both\', linewidth=0.75, color=\'orange\', alpha=0.8) ax.grid(which=\'minor\', axis=\'both\', linewidth=0.25, color=\'orange\', alpha=0.8) mp.plot(y, \'o-\', color=\'dodgerblue\') mp.show()
4.半对数坐标
mp.figure(\'Grid\', facecolor=\'lightgray\') y = [1, 10, 100, 1000, 100, 10, 1] mp.semilogy(y) mp.show()
import matplotlib.pyplot as mp y = [1, 10, 100, 2000, 100, 10, 1] mp.figure(\'GridLine\', facecolor=\'lightgray\') mp.title(\'GridLine\') mp.subplot(211) ax = mp.gca() ma_loc = mp.MultipleLocator(1) ax.xaxis.set_major_locator(ma_loc) mi_loc = mp.MultipleLocator(0.1) ax.xaxis.set_minor_locator(mi_loc) ma_loc = mp.MultipleLocator(250) ax.yaxis.set_major_locator(ma_loc) mi_loc = mp.MultipleLocator(50) ax.yaxis.set_minor_locator(mi_loc) # 绘制刻度网格线 ax.grid(which=\'major\', axis=\'both\', linewidth=0.75, color=\'orange\', alpha=0.8) ax.grid(which=\'minor\', axis=\'both\', linewidth=0.25, color=\'orange\', alpha=0.8) mp.plot(y, \'o-\', color=\'dodgerblue\') mp.subplot(212) # 定义刻度定位器 ax = mp.gca() ma_loc = mp.MultipleLocator(1) ax.xaxis.set_major_locator(ma_loc) mi_loc = mp.MultipleLocator(0.1) ax.xaxis.set_minor_locator(mi_loc) ma_loc = mp.MultipleLocator(250) ax.yaxis.set_major_locator(ma_loc) mi_loc = mp.MultipleLocator(50) ax.yaxis.set_minor_locator(mi_loc) # 绘制刻度网格线 ax.grid(which=\'major\', axis=\'both\', linewidth=0.75, color=\'orange\', alpha=0.8) ax.grid(which=\'minor\', axis=\'both\', linewidth=0.25, color=\'orange\', alpha=0.8) mp.semilogy(y, \'o-\', color=\'dodgerblue\') mp.show()
5.散点图
mp.scatter( x, # x轴坐标数组 y, # y轴坐标数组 marker=\'\', # 点型 s=10, # 大小 color=\'\', # 颜色 edgecolor=\'\', # 边缘颜色 facecolor=\'\', # 填充色 zorder=\'\' # 图层序号 )
numpy.random提供了normal函数用于产生符合 正态分布 的随机数
n = 100 # 172: 期望值 # 10: 标准差 # n: 数字生成数量 x = np.random.normal(172, 20, n) y = np.random.normal(60, 10, n)
案例:绘制平面散点图。
mp.figure(\'scatter\', facecolor=\'lightgray\') mp.title(\'scatter\') mp.scatter(x, y) mp.show()
设置点的颜色
mp.scatter(x, y, c=\'red\') #直接设置颜色 d = (x-172)**2 + (y-60)**2 mp.scatter(x, y, c=d, cmap=\'jet\') #以c作为参数,取cmap颜色映射表中的颜色值
cmap颜色映射表参照附件:cmap颜色映射表
import matplotlib.pyplot as mp import numpy as np #生成一组服从正态分布的随机数 n=300 x=np.random.normal(173,4.5,n)#身高 y=np.random.normal(60,10,n)#体重 d=(x-173)**2+(y-60)**2 mp.figure(\'Scatter\',facecolor=\'lightgray\') mp.title(\'Persons\',fontsize=16) mp.xlabel(\'Height\',fontsize=14) mp.ylabel(\'Weight\',fontsize=14) mp.scatter(x,y,c=d,cmap=\'jet_r\',label=\'Persons\',s=60) mp.legend() mp.show()
6.填充
以某种颜色自动填充两条曲线的闭合区域。
mp.fill_between( x, # x轴的水平坐标 sin_x, # 下边界曲线上点的垂直坐标 cos_x, # 上边界曲线上点的垂直坐标 sin_x<cos_x, # 填充条件,为True时填充 color=\'\', # 填充颜色 alpha=0.2 # 透明度 )
#填充 import numpy as np import matplotlib.pyplot as mp x=np.linspace(0,8*np.pi,1000) sinx=np.sin(x) cosx=np.cos(x) mp.figure(\'Fill\',facecolor=\'lightgray\') mp.title(\'Fill\',fontsize=16) mp.grid(linestyle=\':\') mp.plot(x,sinx,color=\'blue\',label=\'sinx\') mp.plot(x,cosx,color=\'red\',label=\'cosx\') #填充 mp.fill_between(x,sinx,cosx,sinx<cosx, color=\'dodgerblue\',alpha=0.2) mp.fill_between(x,sinx,cosx,sinx>cosx, color=\'red\',alpha=0.2) mp.legend() mp.show()
7.条形图
mp.figure(\'Bar\', facecolor=\'lightgray\') mp.bar( x, # 水平坐标数组 y, # 柱状图高度数组 width, # 柱子的宽度 bottom, # 柱子的底部基准位置 color=\'\', # 填充颜色 label=\'\', # alpha=0.2 # )
柱状图与折线图的区别:柱状图可以进行排序,折线图则不能排序
折线图的优势:体现的量比较大 比柱状图多
案例:先以柱状图绘制苹果12个月的销量,然后再绘制橘子的销量。
# 柱状图 import numpy as np import matplotlib.pyplot as mp apples = np.array([30, 25, 22, 36, 21, 29, 20, 24, 33, 19, 27, 15]) oranges = np.array([24, 33, 19, 27, 35, 20, 15, 27, 20, 32, 20, 22]) mp.figure(\'Bar\', facecolor=\'lightgray\') mp.title(\'Bar\', fontsize=16) mp.xlabel(\'Mouth\', fontsize=14) mp.ylabel(\'Valume\', fontsize=14) mp.grid(linestyle=\':\', axis=\'x\') x = np.arange(apples.size) mp.bar(x-0.2, apples, 0.4, color=\'dodgerblue\', label=\'Apple\',align=\'center\') x = np.arange(oranges.size) mp.bar(x+0.2,oranges, 0.4, color=\'red\', label=\'Orange\',align=\'center\') mp.xticks(x, [ \'Jan\', \'Feb\', \'Mar\', \'Apr\', \'May\', \'Jun\', \'Jul\', \'Aug\', \'Sep\', \'Oct\', \'Nov\', \'Dec\']) mp.legend() mp.show()
柱状图排序
# 柱状图排序 import numpy as np import matplotlib.pyplot as mp apples = np.array([30, 25, 22, 36, 21, 29, 20, 24, 33, 19, 27, 15]) mp.figure(\'Bar\', facecolor=\'lightgray\') mp.title(\'Bar\', fontsize=16) mp.xlabel(\'Mouth\', fontsize=14) mp.ylabel(\'Valume\', fontsize=14) mp.grid(linestyle=\':\', axis=\'x\') x = np.arange(apples.size) x1 = x[np.argsort(apples)] y = apples[np.argsort(apples)] mp.xticks(np.arange(len(x)), x1, fontsize =18) mp.bar(np.arange(len(x)),y) mp.legend() mp.show()
8.饼图
mp.pie( values, # 值列表 spaces, # 扇形之间的间距列表 labels, # 标签列表 colors, # 颜色列表 \'%d%%\', # 标签所占比例格式 shadow=True, # 是否显示阴影 startangle=90 # 逆时针绘制饼状图时的起始角度 radius=1 # 半径 )
案例:绘制饼状图显示5门语言的流行程度:
# 饼状图 import matplotlib.pyplot as mp #整理数据 values = [26, 15, 20, 5, 18] spaces = [0.01,0.01,0.05,0.01,0.01] labels = [\'Java\', \'Javascript\', \'Python\', \'PHP\', \'C++\'] colors = [\'dodgerblue\',\'orangered\',\'limegreen\',\'violet\',\'gold\'] #饼状图 mp.figure(\'Pie\',facecolor=\'lightgray\') mp.title(\'Pie\',fontsize=16) #等轴比例 mp.axis(\'equal\') mp.pie( values, # 值列表 spaces, # 扇形之间的间距列表 labels, # 标签列表 colors, # 颜色列表 \'%.2f%%\', # 标签所占比例格式 shadow=True, # 是否显示阴影 startangle=90, # 逆时针绘制饼状图时的起始角度 radius=1 # 半径 ) mp.legend() mp.show()
9.等高线图
组成等高线需要网格点坐标矩阵,也需要每个点的高度。所以等高线属于3D数学模型范畴。
cntr = mp.contour( x, # 网格坐标矩阵的x坐标 (2维数组) y, # 网格坐标矩阵的y坐标 (2维数组) z, # 网格坐标矩阵的z坐标 (2维数组) 8, # 把等高线绘制成8部分 colors=\'black\', # 等高线的颜色 linewidths=0.5 # 线宽 )
#为等高线添加标签 mp.clabel(cntr, inline_spacing=1, fmt=\'%.1f\', fontsize=10) mp.contourf(x, y, z, 8, cmap=\'jet\')
案例:生成网格坐标矩阵,并且绘制等高线:
#等高线图 import matplotlib.pyplot as mp import numpy as np n = 500 #生成二维数组 x,y = np.meshgrid(np.linspace(-3,3,n), np.linspace(-3,3,n)) # print(x,y) z = (1-x/2+x**5+y**3)*np.exp(1-x**2-y**2) # print(z) #生成等高线矩阵 mp.figure(\'Contour\',facecolor=\'lightgray\') mp.title(\'Contour\',fontsize=16) cntr = mp.contour(x,y,z,colors=\'black\', linewidths=0.75) mp.clabel(cntr,fmt=\'%.2f\',inline_spacing=1,fontsize=8) #填充等高线 mp.contourf(x,y,z,8,cmap=\'jet\') mp.show()
10.热成像图
用图形的方式显示矩阵及矩阵中值的大小
1 2 3
4 5 6
7 8 9
# 把矩阵z图形化,使用cmap表示矩阵中每个元素值的大小 # origin: 坐标轴方向 # upper: 缺省值,原点在左上角 # lower: 原点在左下角 mp.imshow(z, cmap=\'jet\', origin=\'lower\')
使用颜色条显示热度值:
mp.colorbar()
#热成像图 import matplotlib.pyplot as mp import numpy as np n = 500 #生成二维数组 x,y = np.meshgrid(np.linspace(-3,3,n), np.linspace(-3,3,n)) # print(x,y) z = (1-x/2+x**5+y**3)*np.exp(1-x**2-y**2) # print(z) #绘制热成像图 mp.figure(\'Imshow\',facecolor=\'lightgray\') mp.title(\'Imshow\',fontsize=16) mp.imshow(z,cmap=\'jet\',origin=\'lower\') mp.colorbar()#颜色条 mp.show()
11.极坐标系
mp.figure("Polar", facecolor=\'lightgray\') mp.gca(projection=\'polar\') mp.title(\'Porlar\', fontsize=20) mp.xlabel(r\'$\theta$\', fontsize=14) mp.ylabel(r\'$\rho$\', fontsize=14) mp.tick_params(labelsize=10) mp.grid(linestyle=\':\') mp.show()
在极坐标系中绘制曲线:
#准备数据 t = np.linspace(0, 4*np.pi, 1000) r = 0.8 * t mp.plot(t, r) mp.show()
#极坐标系 import numpy as np import matplotlib.pyplot as mp t = np.linspace(0,4*np.pi,1000) r = 0.8*t mp.figure(\'Polar\',facecolor=\'lightgray\') mp.gca(projection=\'polar\') mp.title(\'Polar\',fontsize=16) mp.xlabel(r\'$\theta$\') mp.ylabel(r\'$\rho$\') mp.grid(linestyle=":") mp.plot(t,r) mp.show()
#极坐标系 import numpy as np import matplotlib.pyplot as mp t = np.linspace(0,4*np.pi,1000) r = 0.8*t mp.figure(\'Polar\',facecolor=\'lightgray\') mp.gca(projection=\'polar\') mp.title(\'Polar\',fontsize=16) x=np.linspace(0,6*np.pi,1000) y= 3 * np.sin(6*x) mp.plot(x,y) mp.show()
12.3D散点图
matplotlib支持绘制三维曲面。若希望绘制三维曲面,需要使用axes3d提供的3d坐标系。
from mpl_toolkits.mplot3d import axes3d ax3d = mp.gca(projection=\'3d\') # class axes3d
matplotlib支持绘制三维点阵、三维曲面、三维线框图:
ax3d.scatter(..) # 绘制三维点阵 ax3d.plot_surface(..) # 绘制三维曲面 ax3d.plot_wireframe(..) # 绘制三维线框图
ax3d.scatter( x, # x轴坐标数组 y, # y轴坐标数组 z, # z轴坐标数组 marker=\'\', # 点型 s=10, # 大小 zorder=\'\', # 图层序号 color=\'\', # 颜色 edgecolor=\'\', # 边缘颜色 facecolor=\'\', # 填充色 c=v, # 颜色值 根据cmap映射应用相应颜色 cmap=\'\' # )
案例:随机生成3组坐标,程标准正态分布规则,并且绘制它们。
#三维散点图 import numpy as np import matplotlib.pyplot as mp from mpl_toolkits.mplot3d import axes3d n=300 x = np.random.normal(0,1,n) y = np.random.normal(0,1,n) z = np.random.normal(0,1,n) mp.figure(\'3D Points\',facecolor=\'lightgray\') ax3d = mp.gca(projection=\'3d\') ax3d.set_xlabel(\'x\') ax3d.set_ylabel(\'y\') ax3d.set_zlabel(\'z\') d=x**2+y**2+z**2 ax3d.scatter(x,y,z,s=70,alpha=0.7,c=d,cmap=\'jet\') mp.tight_layout()#紧凑布局 mp.show()
3D曲面图
ax3d.plot_surface( x, # 网格坐标矩阵的x坐标 (2维数组) y, # 网格坐标矩阵的y坐标 (2维数组) z, # 网格坐标矩阵的z坐标 (2维数组) rstride=30, # 行跨距 cstride=30, # 列跨距 cmap=\'jet\' # 颜色映射 )
案例:绘制3d平面图
#3D曲面图 import matplotlib.pyplot as mp import numpy as np from mpl_toolkits.mplot3d import axes3d n = 500 #生成三维数组 x,y = np.meshgrid(np.linspace(-3,3,n), np.linspace(-3,3,n)) # print(x,y) z = (1-x/2+x**5+y**3)*np.exp(1-x**2-y**2) # print(z) #绘制3D曲面图 mp.figure(\'3D Surface\',facecolor=\'lightgray\') ax3d = mp.gca(projection=\'3d\') ax3d.plot_surface(x,y,z,cstride=30,rstride=30,cmap=\'jet\') mp.tight_layout() mp.show()
3D线框图的绘制
# 绘制3D线框图 # rstride: 行跨距 # cstride: 列跨距 ax3d.plot_wireframe(x,y,z,rstride=30,cstride=30, linewidth=1, color=\'dodgerblue\')
#3D线框图 import matplotlib.pyplot as mp import numpy as np from mpl_toolkits.mplot3d import axes3d n = 500 #生成二维数组 x,y = np.meshgrid(np.linspace(-3,3,n), np.linspace(-3,3,n)) # print(x,y) z = (1-x/2+x**5+y**3)*np.exp(1-x**2-y**2) # print(z) #绘制3D线框图 mp.figure(\'3D WireFrame\',facecolor=\'lightgray\') ax3d = mp.gca(projection=\'3d\') ax3d.plot_wireframe(x,y,z,cstride=20,rstride=20,linewidth=0.5,color=\'orangered\') mp.tight_layout() mp.show()
13.简单动画
动画即是在一段时间内快速连续的重新绘制图像的过程。
matplotlib提供了方法用于处理简单动画的绘制。定义update函数用于即时更新图像。
import matplotlib.animation as ma #定义更新函数行为 def update(number): pass # 每隔10毫秒执行一次update更新函数,作用于mp.gcf()当前窗口对象 # mp.gcf(): 获取当前窗口 # update: 更新函数 # interval: 间隔时间(单位:毫秒) anim = ma.FuncAnimation(mp.gcf(), update, interval=10) mp.show()
案例:随机生成各种颜色的100个气泡。让他们不断的增大。
import numpy as np import matplotlib.pyplot as mp import matplotlib.animation as ma # 自定义一种可以存放在ndarray里的类型,用于保存一个球 ball_type = np.dtype([ (\'position\', float, 2), # 位置(水平和垂直坐标) (\'size\', float, 1), # 大小 (\'growth\', float, 1), # 生长速度 (\'color\', float, 4)]) # 颜色(红、绿、蓝和透明度) # 随机生成100个点对象 n = 100 balls = np.zeros(100, dtype=ball_type) balls[\'position\'] = np.random.uniform(0, 1, (n, 2)) balls[\'size\'] = np.random.uniform(40, 70, n) balls[\'growth\'] = np.random.uniform(10, 20, n) balls[\'color\'] = np.random.uniform(0, 1, (n, 4)) mp.figure("Animation", facecolor=\'lightgray\') mp.title("Animation", fontsize=14) mp.xticks mp.yticks(()) sc = mp.scatter( balls[\'position\'][:, 0], balls[\'position\'][:, 1], balls[\'size\'], color=balls[\'color\'], alpha=0.5) # 定义更新函数行为 def update(number): balls[\'size\'] += balls[\'growth\'] # 每次让一个气泡破裂,随机生成一个新的 boom_ind = number % n balls[boom_ind][\'size\'] = np.random.uniform(40, 70, 1) balls[boom_ind][\'position\'] = np.random.uniform(0, 1, (1, 2)) # 重新设置属性 sc.set_sizes(balls[\'size\']) sc.set_offsets(balls[\'position\']) # 每隔30毫秒执行一次update更新函数,作用于mp.gcf()当前窗口对象 # mp.gcf(): 获取当前窗口 # update: 更新函数 # interval: 间隔时间(单位:毫秒) anim = ma.FuncAnimation(mp.gcf(), update, interval=30) mp.show()
案例:绘制信号曲线:y=sin(2 * π * t) * exp(sin(0.2 * π * t)),数据通过生成器函数生成,在update函数中绘制曲线。
import matplotlib.pyplot as mp import matplotlib.animation as ma import numpy as np mp.figure("Signal", facecolor=\'lightgray\') mp.title("Signal", fontsize=14) mp.xlim(0, 10) mp.ylim(-3, 3) mp.grid(linestyle=\'--\', color=\'lightgray\', alpha=0.5) pl = mp.plot([], [], color=\'dodgerblue\', label=\'Signal\')[0] x = 0 def update(data): t, v = data x, y = pl.get_data() x = np.append(x, t) y = np.append(y, v) # 重新设置数据源 pl.set_data(x, y) # 移动坐标轴 if (x[-1] > 10): mp.xlim(x[-1] - 10, x[-1]) def y_generator(): global x y = np.sin(2 * np.pi * x) * np.exp(np.sin(0.2 * np.pi * x)) yield (x, y) x += 0.05 anim = ma.FuncAnimation(mp.gcf(), update, y_generator, interval=20) mp.tight_layout() mp.show()