matplotlib基本功能

  • matplotlib概述
  • matplotlib基本功能
    • 基本绘图
      • 绘图核心API
      • 线型、线宽和颜色
      • 设置坐标轴范围
      • 设置坐标刻度
      • 设置坐标轴
      • 图例
        • 设置图例的位置
      • 特殊点
      • 备注
    • 图形对象(图形窗口)
      • 设置当前窗口的参数
      • 子图
        • 矩阵式布局
        • 网格式布局
        • 自由式布局
      • 刻度定位器
      • 刻度网格线
      • 半对数坐标
      • 散点图
      • 填充
      • 条形图(柱状图)
      • 饼图
      • 等高线图
      • 热成像图
      • 3D图像绘制
        • 3d散点图的绘制相关API
        • 3d平面图的绘制相关API
        • 3d线框图的绘制相关API
      • 极坐标系
      • 简单动画

matplotlib概述

matplotlib是python的一个绘图库。使用它可以很方便的绘制出版质量级别的图形。

matplotlib基本功能

基本绘图

绘图核心API

import numpy as np
import matplotlib.pyplot as mp# xarray: <序列> 水平坐标序列
# yarray: <序列> 垂直坐标序列
mp.plot(xarray, yarray)
#显示图表
mp.show()

绘制水平线与垂直线:

import numpy as np
import matplotlib.pyplot as mp# vertical 绘制垂直线
mp.vlines(vval, ymin, ymax, ...)
# horizotal 绘制水平线
mp.hlines(xval, xmin, xmax, ...)
#显示图表
mp.show()

举个例子

import numpy as np
import matplotlib.pyplot as mpx = np.array([0, 1, 2, 3, 4, 5, 6, 7])
y = np.array([45,81,36,51,19,92,23,51])
mp.plot(x, y)# 绘制水平线 在纵坐标为60的地方,画一条横坐标从1到6.5的水平线
mp.hlines(60, 1, 6.5)
# 绘制垂直线
mp.vlines([1,2,3,4,5], [10,20,30,40,50], [25,35,45,55,65])
#分别在横坐标为1 2 3 4 5的地方,画5条垂直线,具体起始坐标是后面两个列表的元素
mp.show()

运行结果:

线型、线宽和颜色

linestyle: 线型 ‘-’ ‘–’ ‘-.’ ‘:’
linewidth: 线宽(数字)
color: <关键字参数> 颜色,可以写:英文颜色单词 或 常见颜色英文单词首字母 或 #495434 或 (1,1,1) 或 (1,1,1,1)
alpha: <关键字参数> 透明度(浮点数值)

mp.plot(xarray, yarray, linestyle='', linewidth=1, color='', alpha=0.5)

设置坐标轴范围

x_limt_min: x轴范围最小值
x_limit_max: x轴范围最大值
y_limt_min: y轴范围最小值
y_limit_max: y轴范围最大值

mp.xlim(x_limt_min, x_limit_max)
mp.ylim(y_limt_min, y_limit_max)

设置坐标刻度

x_val_list: x轴刻度值序列
x_text_list: x轴刻度标签文本序列 [可选]
y_val_list: y轴刻度值序列
y_text_list: y轴刻度标签文本序列 [可选]

mp.xticks(x_val_list , x_text_list )
mp.yticks(y_val_list , y_text_list )

刻度文本的特殊语法LaTex排版语法字符串

r'$x^n+y^n=z^n$',   r'$\int\frac{1}{x} dx = \ln |x| + C$',     r'$-\frac{\pi}{2}$'

x 2 + y 2 = z 2 , ∫ 1 x d x = ln ⁡ ∣ x ∣ + C , − π 2 x^2+y^2=z^2, \int\frac{1}{x} dx = \ln |x| + C, -\frac{\pi}{2} x2+y2=z2,∫x1​dx=ln∣x∣+C,−2π​

设置坐标轴

坐标轴名:left / right / bottom / top

# 获取当前坐标轴字典,{'left':左轴,'right':右轴,'bottom':下轴,'top':上轴 }
ax = mp.gca()  # getCurrentaxis
# 获取其中某个坐标轴
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.5))
ax.spines['top'].set_color('none')
ax.spines['right'].set_color('none')

运行结果:

图例

再绘制曲线时定义曲线的label(plot函数中的参数)
label: <关键字参数 str> 支持LaTex排版语法字符串

设置图例的位置

loc: <关键字参数> 制定图例的显示位置 (若不设置loc,则显示默认位置)
String 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.plot(xarray, yarray ... label='', ...)
mp.legend(loc='')

特殊点

xarray: <序列> 所有需要标注点的水平坐标组成的序列
yarray: <序列> 所有需要标注点的垂直坐标组成的序列

mp.scatter(xarray, yarray, marker='',         #点型 ~ matplotlib.markerss=70,          #大小edgecolor='',     #边缘色facecolor='',    #填充色zorder=3           #绘制图层编号 (编号越大,图层越靠上)
)

marker点型可参照:help(matplotlib.markers)

备注

案例:为在某条曲线上的点添加备注,指明函数方程与值。

# 在图表中为某个点添加备注。包含备注文本,备注箭头等图像的设置。
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
=============================================

举个例子:(绘制 sin(x) 和 cos(x) / 2 函数)

import numpy as np
import matplotlib.pyplot as mp#从-pi到pi拆1000个点
x = np.linspace(-np.pi, np.pi, 1000)
sinx = np.sin(x)# 画一个y = cos(x)/2
cosx = np.cos(x) / 2# 修改x轴的刻度
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) #设置x轴坐标刻度# 设置坐标轴
ax = mp.gca()
ax.spines['top'].set_color('none')
ax.spines['right'].set_color('none')
ax.spines['left'].set_position(('data', 0))
ax.spines['bottom'].set_position(('data', 0))
mp.yticks([-1.0, -0.5, 0.5, 1.0]) #设置y轴刻度#设置绘制的两条线的属性
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.scatter([np.pi/2, np.pi/2], [1, 0],s=[120,80], marker='o', edgecolor='red', facecolor='green', zorder=3) #zorder是图层顺序# 为特殊点添加备注
mp.annotate(r'$[\frac{\pi}{2}, 1]$', xycoords='data', xy=(np.pi/2, 1), textcoords='offset points', xytext=(20, 30),fontsize=14, arrowprops=dict(arrowstyle='->',connectionstyle='angle3'))
mp.legend() #显示图例
mp.show()

运行结果:

图形对象(图形窗口)

# 手动构建 matplotlib 窗口
mp.figure('',                 #窗口标题栏文本 figsize=(4, 3),       #窗口大小 <元组>dpi=120,           #像素密度facecolor=''        #图表背景色
)
mp.show() 

mp.figure方法不仅可以构建一个新窗口,如果已经构建过title='AAA’的窗口,又使用figure方法构建了title=‘AAA’ 的窗口的话,mp将不会创建新的窗口,而是把title='AAA’的窗口置为当前操作窗口。(这个title指的是窗口的标题,不是图表的标题)

设置当前窗口的参数

设置图表标题 显示在图表上方,注意!这是图标的标题,不是窗口的标题!
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 matplotlib.pyplot as mp
mp.figure('Figure A', facecolor='lightgray')
mp.title('Figure AAA', fontsize=16)
mp.grid(linestyle=':')
mp.figure('Figure B', facecolor='gray')
mp.title('Figure BBB', fontsize=16)
mp.grid(linestyle='-.')
mp.figure('Figure A')
mp.xlabel('Date', fontsize=14)
mp.ylabel('Price', fontsize=14)
mp.tight_layout()
mp.show()

运行结果:

子图

矩阵式布局

绘制矩阵式子图布局相关API:
拆分矩阵
rows: 行数
cols: 列数
num: 编号
mp.subplot(rows, cols, num)

mp.figure('Subplot Layout', facecolor='lightgray')
mp.subplot(3, 3, 5)     #操作3*3的矩阵中编号为5的子图
mp.subplot(335)         #简写

运行结果:

案例:绘制9宫格矩阵式子图,每个子图中写一个数字。

mp.figure('Subplot Layout', facecolor='lightgray')
for i in range(9):mp.subplot(3, 3, i+1)mp.text(0.5, 0.5, i+1, # 第三个参数是具体内容ha='center', va='center',size=36,alpha=0.5,)mp.xticks([])mp.yticks([])
mp.tight_layout()
mp.show()

运行结果:

网格式布局

网格式布局支持单元格的合并。
绘制网格式子图布局相关API:

调用GridSpec方法拆分网格式布局
rows: 行数
cols: 列数
gs = mg.GridSpec(rows, cols)

import matplotlib.gridspec as mg
mp.figure('GridLayout', facecolor='lightgray')
gridsubs = mp.GridSpec(3, 3) # 拆分成3行3列
# 合并0行、0/1列为一个子图
mp.subplot(gridsubs[0, :2])
mp.text(0.5, 0.5, 1, ha='center', va='center', size=36)
mp.tight_layout()
mp.xticks([])
mp.yticks([])

运行结果:

自由式布局

自由式布局相关API:
设置图标的位置,给出左下角点坐标与宽高即可
left_bottom_x: 坐下角点x坐标
left_bottom_x: 坐下角点y坐标
width: 宽度
height: 高度
mp.axes([left_bottom_x, left_bottom_y, width, height])

mp.figure('FlowLayout', facecolor='lightgray')
mp.axes([0.1, 0.2, 0.5, 0.3]) # 第一二个参数是图标左下角的横纵坐标,第三四个参数是图标的相对跨度
mp.text(0.5, 0.5, 1, ha='center', va='center', size=36)
mp.show()

刻度定位器

刻度定位器相关API:
获取当前坐标轴:ax = mp.gca()
设置水平坐标轴的主刻度定位器:ax.xaxis.set_major_locator(mp.NullLocator())
设置水平坐标轴的次刻度定位器为多点定位器,间隔0.1:ax.xaxis.set_minor_locator(mp.MultipleLocator(0.1))
案例:绘制一个数轴。

mp.figure('Locators', facecolor='lightgray')
# 获取当前坐标轴
ax = mp.gca()
# 隐藏除底轴以外的所有坐标轴
ax.spines['left'].set_color('none')
ax.spines['top'].set_color('none')
ax.spines['right'].set_color('none')
# 将底坐标轴调整到子图中心位置
ax.spines['bottom'].set_position(('data', 0))
# 设置水平坐标轴的主刻度定位器
ax.xaxis.set_major_locator(mp.NullLocator())
# 设置水平坐标轴的次刻度定位器为多点定位器,间隔0.1
ax.xaxis.set_minor_locator(mp.MultipleLocator(0.1))
# 标记所用刻度定位器类名
mp.text(5, 0.3, 'NullLocator()', ha='center', size=12)


案例:使用for循环测试刻度器样式:

import numpy as np
import matplotlib.pyplot as mplocators = ['mp.NullLocator()', 'mp.MultipleLocator(1)', 'mp.MaxNLocator(nbins=3)', 'mp.AutoLocator()']mp.figure('Locator', facecolor='lightgray')
mp.title('Locator', fontsize=18)for i, locator in enumerate(locators):mp.subplot(len(locators), 1, i+1)ax = mp.gca()ax.xaxis.set_major_locator(eval(locator))ax.xaxis.set_minor_locator(mp.MultipleLocator(0.1))# ax.xaxis.set_minor_locator(mp.NullLocator())mp.xlim(1, 10)ax.spines['top'].set_color('none')ax.spines['right'].set_color('none')ax.spines['left'].set_color('none')ax.spines['bottom'].set_position(('data', 0.5))mp.yticks([])
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)

刻度网格线

绘制刻度网格线的相关API:

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],然后设置刻度网格线,测试刻度网格线的参数。

y = np.array([1, 10, 100, 1000, 100, 10, 1])
mp.figure('Normal & Log', facecolor='lightgray')
mp.subplot(211)
mp.title('Normal', fontsize=20)
mp.ylabel('y', fontsize=14)
ax = mp.gca()
ax.xaxis.set_major_locator(mp.MultipleLocator(1.0))
ax.xaxis.set_minor_locator(mp.MultipleLocator(0.1))
ax.yaxis.set_major_locator(mp.MultipleLocator(250))
ax.yaxis.set_minor_locator(mp.MultipleLocator(50))
mp.tick_params(labelsize=10)
ax.grid(which='major', axis='both', linewidth=0.75,linestyle='-', color='orange')
ax.grid(which='minor', axis='both', linewidth=0.25,linestyle='-', color='orange')
mp.plot(y, 'o-', c='dodgerblue', label='plot')
mp.legend()

运行结果:

半对数坐标

y轴将以指数方式递增。 基于半对数坐标绘制第二个子图,表示曲线:[1, 10, 100, 1000, 100, 10, 1]。

mp.figure('Grid', facecolor='lightgray')
y = [1, 10, 100, 1000, 100, 10, 1]
mp.semilogy(y)
mp.show()


综合起来举个例子:

import matplotlib.pyplot as mpy = [1, 10, 100, 1000, 100, 10, 1]
# 设置刻度定位器
mp.figure('Grid Line', facecolor='lightgray')mp.subplot(211)
ax = mp.gca()
ax.xaxis.set_major_locator(mp.MultipleLocator(1))
ax.xaxis.set_minor_locator(mp.MultipleLocator(0.1))
ax.yaxis.set_major_locator(mp.MultipleLocator(250))
ax.yaxis.set_minor_locator(mp.MultipleLocator(50))
# 刻度网格线
ax.grid(which='major', axis='both', color='orangered', linewidth=0.5)
ax.grid(which='minor', axis='both', color='orangered', linewidth=0.25)
mp.plot(y, 'o-')mp.subplot(212)
ax = mp.gca()
ax.xaxis.set_major_locator(mp.MultipleLocator(1))
ax.xaxis.set_minor_locator(mp.MultipleLocator(0.1))
ax.yaxis.set_major_locator(mp.MultipleLocator(250))
ax.yaxis.set_minor_locator(mp.MultipleLocator(50))
# 刻度网格线
ax.grid(which='major', axis='both', color='orangered', linewidth=0.5)
ax.grid(which='minor', axis='both', color='orangered', linewidth=0.25)
mp.semilogy(y, 'o-')
mp.show()

散点图

可以通过每个点的坐标、颜色、大小和形状表示不同的特征值。

身高 体重 性别 年龄段 种族
180 80 中年 亚洲
160 50 青少 美洲

绘制散点图的相关API:

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颜色映射表

绘制散点图:

import numpy as np
import matplotlib.pyplot as mp
n = 200
x = np.random.normal(175, 7, n)
y = np.random.normal(65, 10, n)
mp.figure('Scatter', facecolor='lightgray')
mp.title('Scatter', fontsize=18)
mp.grid(linestyle=':')
d = (x-175)**2 + (y-65)**2
mp.scatter(x, y, marker='o', s=70,c=d, cmap='gist_rainbow', label='Samples')
mp.legend()
mp.show()

填充

以某种颜色自动填充两条曲线的闭合区域。

mp.fill_between(x,               # x轴的水平坐标sin_x,         # 下边界曲线上点的垂直坐标cos_x,            # 上边界曲线上点的垂直坐标sin_x < cos_x,     # 填充条件,为True时填充color='',      # 填充颜色alpha=0.2        # 透明度
)

案例:绘制两条曲线:
sin_x = sin(x)
cos_x = cos(x / 2) / 2 [0 ~ 8π]

n = 1000
x = np.linspace(0, 8 * np.pi, n)
sin_y = np.sin(x)
cos_y = np.cos(x / 2) / 2
mp.figure('Fill', facecolor='lightgray')
mp.title('Fill', fontsize=20)
mp.xlabel('x', fontsize=14)
mp.ylabel('y', fontsize=14)
mp.tick_params(labelsize=10) # 参数labelsize用于设置刻度线标签(数轴坐标)的字体大小
mp.grid(linestyle=':')
mp.plot(x, sin_y, c='dodgerblue', label=r'$y=sin(x)$')
mp.plot(x, cos_y, c='orangered', label=r'$y=\frac{1}{2}cos(\frac{x}{2})$')
mp.fill_between(x, cos_y, sin_y, cos_y < sin_y, color='dodgerblue', alpha=0.5)
mp.fill_between(x, cos_y, sin_y, cos_y > sin_y, color='orangered', alpha=0.5)
mp.legend()
mp.show()

条形图(柱状图)

绘制柱状图的相关API:

mp.figure('Bar', facecolor='lightgray')
mp.bar(x,               # 水平坐标数组y,              # 柱状图高度数组width,         # 柱子的宽度color='',         # 填充颜色label='',      #alpha=0.2     #
)

案例:先以柱状图绘制苹果12个月的销量,然后再绘制橘子的销量。

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=20)
mp.xlabel('Month', fontsize=14)
mp.ylabel('Price', fontsize=14)
mp.tick_params(labelsize=10)
mp.grid(axis='y', linestyle=':')
mp.ylim((0, 40))
x = np.arange(len(apples))
mp.bar(x - 0.2, apples, 0.4, color='dodgerblue', label='Apple', align='center')
mp.bar(x + 0.2, oranges, 0.4, color='orangered',label='Orange', alpha=0.75, align='center')
mp.xticks(x, ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun','Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'])
mp.legend()
mp.show()


假如苹果的销量从纵坐标5开始计算,应该修改mp.bar()中的参数:
mp.bar(x - 0.2, apples, 0.4, 5, color=‘dodgerblue’, label=‘Apple’, align=‘center’)
效果图:

饼图

绘制饼状图的基本API:

mp.pie(values,       # 值列表       spaces,         # 扇形之间的间距列表labels,      # 标签列表colors,       # 颜色列表'%d%%',         # 标签所占比例格式shadow=True,     # 是否显示阴影startangle=90  # 逆时针绘制饼状图时的起始角度radius=1       # 半径
)

案例:绘制饼状图显示5门语言的流行程度:

mp.figure('pie', facecolor='lightgray')
#整理数据
values = [26, 17, 21, 29, 11]
spaces = [0.05, 0.01, 0.01, 0.01, 0.01]
labels = ['Python', 'JavaScript','C++', 'Java', 'PHP']
colors = ['dodgerblue', 'orangered','limegreen', 'violet', 'gold']
mp.title('Pie', fontsize=20)
# 等轴比例
mp.axis('equal')
mp.pie(values,      # 值列表       spaces,         # 扇形之间的间距列表labels,      # 标签列表colors,       # 颜色列表'%.1f%%',           # 标签所占比例格式shadow=True,     # 是否显示阴影startangle=90, # 逆时针绘制饼状图时的起始角度radius=1       # 半径
)

等高线图

组成等高线需要网格点坐标矩阵,也需要每个点的高度。所以等高线属于3D数学模型范畴。

绘制等高线的相关API:

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')

案例:生成网格坐标矩阵,并且绘制等高线:

n = 1000
# 生成网格化坐标矩阵
x, y = np.meshgrid(np.linspace(-3, 3, n),np.linspace(-3, 3, n))
# 根据每个网格点坐标,通过某个公式计算z高度坐标
z = (1 - x/2 + x**5 + y**3) * np.exp(-x**2 - y**2)
mp.figure('Contour', facecolor='lightgray')
mp.title('Contour', fontsize=20)
mp.xlabel('x', fontsize=14)
mp.ylabel('y', fontsize=14)
mp.tick_params(labelsize=10)
mp.grid(linestyle=':')
# 绘制等高线图
mp.contourf(x, y, z, 8, cmap='jet') # 显示颜色效果
cntr = mp.contour(x, y, z, 8, colors='black', linewidths=0.5) # 显示等高线
# 为等高线图添加高度标签
mp.clabel(cntr, inline_spacing=1, fmt='%.1f', fontsize=10) # inline_spacing参数是数字与等高线之间的间隙
mp.show()

热成像图

绘制热成像图的相关API:

# 把矩阵z图形化,使用cmap表示矩阵中每个元素值的大小
# origin: 坐标轴方向
#    upper: 缺省值,原点在左上角
#    lower: 原点在左下角
mp.imshow(z, cmap='jet', origin='low')

使用颜色条显示热度值:mp.colorbar()

import numpy as np
import matplotlib.pyplot as mpn = 500
x, y = np.meshgrid(np.linspace(-3, 3, n), np.linspace(-3, 3, n))
# 根据每个网格点坐标,通过某个公式计算z高度坐标
z = (1 - x/2 + x**5 + y**3) * np.exp(-x**2 - y**2)# 绘制热成像图
mp.figure('Imshow', facecolor='lightgray')
mp.title('Imshow', fontsize=18)
mp.grid(linestyle=':')
# mp.imshow(z, cmap='jet', origin='lower')
mp.imshow(z, cmap='gist_rainbow', origin='lower')
# mp.imshow(z, cmap='gray', origin='lower')
mp.colorbar()
mp.show()

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(..) # 绘制三维线框图

3d散点图的绘制相关API

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 axes3dn = 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 Scatter', facecolor='lightgray')
mp.title('3D Scatter', fontsize=18)
ax3d = mp.gca(projection='3d')
ax3d.set_xlabel('x', fontsize=14)
ax3d.set_ylabel('y', fontsize=14)
ax3d.set_zlabel('z', fontsize=14)
d = x**2 + y**2 + z**2
ax3d.scatter(x, y, z, s=80, c=d, cmap='jet', alpha=0.5)
mp.tight_layout()
mp.show()


还可以用鼠标转动图像:

3d平面图的绘制相关API

ax3d.plot_surface(x,                     # 网格坐标矩阵的x坐标 (2维数组)y,                     # 网格坐标矩阵的y坐标 (2维数组)z,                     # 网格坐标矩阵的z坐标 (2维数组)rstride=30,           # 行跨距cstride=30,       # 列跨距cmap='jet'          # 颜色映射
)

案例:绘制3d平面图

import numpy as np
import matplotlib.pyplot as mp
from mpl_toolkits.mplot3d import axes3dn = 500
x, y = np.meshgrid(np.linspace(-3, 3, n), np.linspace(-3, 3, n))
# 根据每个网格点坐标,通过某个公式计算z高度坐标
z = (1 - x/2 + x**5 + y**3) * np.exp(-x**2 - y**2)mp.figure('3D Surface', facecolor='lightgray')
mp.title('3D Surface', fontsize=18)
ax3d = mp.gca(projection='3d')
ax3d.set_xlabel('x')
ax3d.set_ylabel('y')
ax3d.set_zlabel('z')
ax3d.plot_surface(x, y, z, rstride=30, cstride=30, cmap='jet')
mp.tight_layout()
mp.show()

3d线框图的绘制相关API

ax3d.plot_wireframe(x,                   # 网格坐标矩阵的x坐标 (2维数组)y,                     # 网格坐标矩阵的y坐标 (2维数组)z,                     # 网格坐标矩阵的z坐标 (2维数组)rstride=30,           # 行跨距cstride=30,       # 列跨距linewidth=1         # 线条宽度color='dodgerblue'  # 线条颜色
)
import numpy as np
import matplotlib.pyplot as mp
from mpl_toolkits.mplot3d import axes3dn = 500
x, y = np.meshgrid(np.linspace(-3, 3, n), np.linspace(-3, 3, n))
# 根据每个网格点坐标,通过某个公式计算z高度坐标
z = (1 - x/2 + x**5 + y**3) * np.exp(-x**2 - y**2)mp.figure('3D Surface', facecolor='lightgray')
mp.title('3D Surface', fontsize=18)
ax3d = mp.gca(projection='3d')
ax3d.set_xlabel('x')
ax3d.set_ylabel('y')
ax3d.set_zlabel('z')
ax3d.plot_wireframe(x, y, z, rstride=10, cstride=10, color='dodgerblue',  linewidth=1)
mp.tight_layout()
mp.show()

极坐标系

与笛卡尔坐标系不同,某些情况下极坐标系适合显示与角度有关的图像。例如雷达等。极坐标系可以描述极径ρ与极角θ的线性关系。

mp.figure("Polar", facecolor='lightgray')
mp.gca(projection='polar') # 参数值为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()

在极坐标系中绘制曲线:

#准备数据
mp.gca(projection='polar')
t = np.linspace(0, 4 * np.pi, 1000)
r = 0.8 * t
mp.plot(t, r)
mp.show()


案例,在极坐标系中绘制正弦函数y = 3sin(6x)

mp.gca(projection='polar')
x = np.linspace(0, 6 * np.pi, 1000)
y = 3 * np.sin(6 * x)
mp.plot(x, y)

简单动画

动画即是在一段时间内快速连续的重新绘制图像的过程。

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()
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 % nballs[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'])anim = ma.FuncAnimation(mp.gcf(), update, interval=30)
mp.show()



使用生成器函数提供数据,实现动画绘制

在很多情况下,绘制动画的参数是动态获取的,matplotlib支持定义generator生成器函数,用于生成数据,把生成的数据交给update函数更新图像:

import matplotlib.animation as ma
#定义更新函数行为
def update(data):t, v = data...passdef generator():yield t, v# 每隔10毫秒将会先调用生成器,获取生成器返回的数据,
# 把生成器返回的数据交给并且调用update函数,执行更新图像函数
anim = ma.FuncAnimation(mp.gcf(), update, generator,interval=10)

案例:绘制信号曲线:y=sin(2 * π * t) * exp(sin(0.2 * π * t)),数据通过生成器函数生成,在update函数中绘制曲线。

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]
pl.set_data([],[])x = 0def update(data):t, v = datax, y = pl.get_data()x.append(t)y.append(v)#重新设置数据源pl.set_data(x, y)#移动坐标轴if(x[-1]>10):mp.xlim(x[-1]-10, x[-1])def y_generator():global xy = np.sin(2 * np.pi * x) * np.exp(np.sin(0.2 * np.pi * x))yield (x, y)x += 0.05anim = ma.FuncAnimation(mp.gcf(), update, y_generator, interval=20)
mp.tight_layout()
mp.show()


matplotlib基本功能相关推荐

  1. qmlcanvas绘制3d图形_透视Matplotlib核心功能和工具包 - 绘制3D图形

    关联知识 Matplotlib Python 线图 在此,我们将学习如何创建3D线图. 它类似于2D等效折线图,并且2D折线图的许多属性都结转到3D. 我们将在相同的轴上绘制凹凸曲线,并从不同角度查看 ...

  2. 5绘制收银台程序_透视Matplotlib核心功能和工具包 - 高级特征绘制

    关联知识 Matplotlib Python 使用属性循环器 Matplotlib具有默认的颜色循环,当我们在给定轴上绘制更多图形时,该颜色循环会重复进行. 通过属性循环程序,我们可以在单个函数中为多 ...

  3. 数据分析之numpy基础/matplotlib绘图/numpy常用函数/杂项功能

    文章目录 数据分析 numpy概述 numpy`历史` numpy的核心:多维数组 numpy基础 ndarray数组 内存中的ndarray对象 ndarray数组对象的特点 ndarray数组对象 ...

  4. c#split方法拆分为数据_Dexplot:基于pandas,比matplotlib更简单的数据可视化和数据分析工具...

    Dexplot:建议准备学matplotlib和seaborn的数据可视化新手或者数据可视化爱好者食用 适用于长数据 比如网站用户留言的统计 特色是不用matplotlib 而用pandas导入数据( ...

  5. 何时使用cla(),clf()或close()在matplotlib中清除图?

    Matplotlib提供以下功能: cla() # Clear axis clf() # Clear figure close() # Close a figure window 该文档没有提供很多关 ...

  6. 用python画漂亮图片-使用 Python/matplotlib 画出漂亮的论文插图

    论文中画出各种绚烂的插图,都是用一些什么样的软件画出来的.本文介绍 Python 的绘图模块 matplotlib: Python plotting.适用于从 2D 到 3D,从标量到矢量的各种绘图. ...

  7. 绘图: matplotlib Basemap简介

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在数据可视化过程中,我们常常需要将数据根据其采集的地理位置在地图上显示出来.比如说 ...

  8. 基于 Python Matplotlib 模块的高质量图形输出

    1 关于 Matplotlib 模块 Matplotlib 是一个由 John Hunter 等开发的,用以绘制二维图形的 Python 模块.它利用了 Python 下的数值计算模块 Numeric ...

  9. matplotlib简介-高质量图形输出

    Matplotlib 是一个用来绘制二维图形的 Python 模块,它克隆了许多 Matlab 中的函数, 用以帮助 Python 用户轻松获得高质量(达到出版水平)的二维图形. 文章来源:http: ...

最新文章

  1. C#之消息队列的简要说明
  2. P1064 金明的预算方案
  3. 青少年蓝桥杯_2020_steam考试_初级组_第三题
  4. 【POJ 2485】 Highways
  5. 2008Beta 版AJAX的一个奇怪的问题
  6. 2016CCPC网络赛赛后总结——回顾与反思
  7. 值不值得入手_北龙湖—值不值得入手?
  8. html position的学习
  9. 复选框与文字无法对齐问题
  10. mysql5.6 主从同步
  11. PLSQL使用for update编辑数据库的坑
  12. xlsxwriter去掉网格线_xlsxwriter图表网格间距
  13. Opencv 轮廓提取
  14. signature=89d6821c2fe7d31483f21edf9c96c63b,Forage harvester
  15. shell脚本读写文本文件
  16. 引入微信支付Java SDK WxPayAPI_JAVA.zip
  17. “重塑”—— 与ISV同行
  18. Caffeine Cache和Ehcache3.x 进程缓存性能比较
  19. 圣杯布局-三种实现方式,css经典布局
  20. python中英文字频率_python实现统计文本中单词出现的频率详解

热门文章

  1. 一个好的博客平台需要哪些功能?
  2. Android7.0 数据业务长连接去拨号过程
  3. 数据库系统原理 实验5 数据库恢复技术
  4. PL2586设计电路|PL2586替代FE1.1S电路图|USB2.0HUB工业级集线器方案设计
  5. Docker中批量删除 tag为“none“的镜像_dev_zyx的博客
  6. 天冷了,任务栏养只猫吧「GitHub 热点速览 v.21.46」
  7. 组织行为学笔记-导论
  8. 【渝粤题库】国家开放大学2021春2502学前儿童发展心理学题目
  9. 计算机数据传输通信电路工作原理,数据通信的结构原理_数据通信传输方式
  10. SQL SERVER 2008 R2 序列号大全