maplethefox

matplotlib概述

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

matplotlib基本功能

  (一)基本绘图 (在二维平面坐标系中绘制连续的线)

  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()
semilogy

 

  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        # 透明度
)

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

#填充
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()

 

 

 

 

 

 

 

 

分类:

技术点:

相关文章: