matplotlib基础知识

(一)基础知识

1.基础用法(figure,plot,show)

  • plt.figure:定义一个figure图像窗口,可以有很多小图片
  • plt.plot:绘制曲线
  • plt.show:显示图像
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-3,3,50)
y1 = 2*x + 1
y2 = x**2
plt.figure(num=3,figsize=(8,5)) # 定义一个figure图像窗口,编号为3;大小为(8, 5)
plt.plot(x,y2)
# color曲线颜色:红,linewidth曲线宽度:1.0,linestyle曲线类型:虚线
plt.plot(x,y1,color='red',linewidth=1.0,linestyle='--')
plt.show()

在这里插入图片描述

2.调整轴的刻度范围和名称(xlim,xlabel,xticks)

  • plt.xlim:设置x轴范围
  • plt.xlabel:设置x轴名称
  • plt.xticks:设置x轴刻度及名称
plt.xlim((-1,2)) # 设置x轴范围(-1,2)
plt.ylim((-2,3)) # 设置y轴范围(-2,3)
plt.xlabel('x') # 设置x轴名称
plt.ylabel('y') # 设置y轴名称
new_ticks = np.linspace(-1,2,5) # 5个[-1,2]之间均匀分布的数
plt.xticks(new_ticks)
# 设置y轴刻度及名称,刻度为[-2, -1.8, -1, 1.22, 3];对应刻度的名称为[‘really bad’,’bad’,’normal’,’good’, ‘really good’]
plt.yticks([-2,-1.8,-1,1.22,3],[r'$really\ bad$',r'$bad$', r'$normal$', r'$good$', r'$really\ good$'])
plt.show()

在这里插入图片描述

3.调整坐标轴至原点

(1)设置边框颜色白色

  • plt.gca:获取坐标轴信息
  • ax.spines:选择边框
  • set_color:设置颜色
ax = plt.gca() # 获取当前坐标轴信息
ax.spines['right'].set_color('none') # spines设置边框,选择right右边框,set_color设置边框颜色,默认白色
ax.spines['top'].set_color('none') # spines设置边框,选择top上边框,set_color设置边框颜色,默认白色 

(2)调整坐标轴位置(0,0)中心

  • ax.xaxis.set_ticks_position:设置x轴刻度数字/名称的位置
  • set_position:设置边框位置
# 设置x轴刻度数字/名称的位置为bottom(可选top,bottom,both,default,none)
ax.xaxis.set_ticks_position('bottom') 
# 使用.spines选择底部边框(x轴),使用.set_position设置边框(x轴)位置在y=0处
# 位置属性可选(outward,axes,data)
ax.spines['bottom'].set_position(('data',0))
# 设置y轴刻度数字/名称的位置为left
ax.yaxis.set_ticks_position('left')
# 使用.spines选择左边边框(y轴),使用.set_position设置边框(y轴)位置在x=0处
ax.spines['left'].set_position(('data',0))
plt.show()

在这里插入图片描述

4.显示数据对应的图像名称

  • plt.legend:显示数据名称

将上文中plot代码更改为

plt.plot(x,y2,label='square line')
plt.plot(x,y1,color='red',linewidth=1.0,linestyle='--',label='linear line')

添加如下代码

plt.legend(loc='upper right')

下图中的右上角显示了每个图的名称
在这里插入图片描述
如果想修改label,除了在plot中修改以外,可以先将图像用变量存储起来

l2, = plt.plot(x,y2,label='square line')
l1, = plt.plot(x,y1,color='red',linewidth=1.0,linestyle='--',label='linear line')
plt.legend(handles=[l1,l2],labels=['up','down'],loc='best')

在这里插入图片描述
loc参数表示图像名称的显示位置,best表示自动分配最佳位置

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

5.添加标注(箭头和文本)

  • plt.annotate:指向型注释,标注不仅包含注释的文本内容还包含箭头指向
  • plt.text:文本型注释

首先绘制一条直线

x = np.linspace(-3,3,50)
y = 2*x + 1

plt.figure(num=1,figsize=(8,5))
plt.plot(x,y)

ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')

ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data',0))

ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data',0))

标注点(1,3)的位置信息,绘制一条垂直于x轴的虚线,绘制一个点

x0 = 1
y0 = 3
plt.plot([x0,x0],[0,y0],'k--',linewidth=2.5)
plt.scatter([x0,],[y0,],s=50,color='b')

添加箭头标注

# xycoords='data'基于数据的值来选位置
# xytext=(+30, -30) 和 textcoords='offset points' 对于标注位置的描述和xy偏差值
# arrowprops是对图中箭头类型的一些设置
plt.annotate(r'$2x+1=%s$'%y0,xy=(x0,y0),xycoords='data',xytext=(+30,-30),textcoords='offset points',
            fontsize=16,arrowprops=dict(arrowstyle='->',connectionstyle="arc3,rad=.2"))

添加注释文本

# -3.7,3是text的位置,空格需要转字符\,fontdict设置文本字体大小和颜色
plt.text(-3.7,3,r'$This\ is\ the\ some\ text. \mu\ \sigma_i\ \alpha_t$',
        fontdict={'size':16,'color':'r'})

在这里插入图片描述

(二)画图

散点图scatter

# 生成1024个呈标准正态分布的二维数据组 (平均数是0,方差为1) 作为一个数据集
n = 1024
x = np.random.normal(0,1,n)
y = np.random.normal(0,1,n)
t = np.arctan2(y,x) # 颜色

plt.scatter(x,y,s=75,c=t,alpha=0.5) # size=75,透明的alpha=50%
plt.xlim(-1.5,1.5)
plt.xticks(()) # 隐藏x轴的刻度
plt.ylim(-1.5,1.5)
plt.yticks(())
plt.show()

在这里插入图片描述

柱状图

向上向下分别生成12个数据,X为 0 到 11 的整数 ,Y是相应的均匀分布的随机数据

n = 12
X = np.arange(n)
Y1 = (1 - X / float(n)) * np.random.uniform(0.5, 1.0, n)
Y2 = (1 - X / float(n)) * np.random.uniform(0.5, 1.0, n)

绘制柱状图

plt.bar(X, +Y1, facecolor='#9999ff', edgecolor='white')
plt.bar(X, -Y2, facecolor='#ff9999', edgecolor='white')

plt.xlim(-.5, n)
#plt.xticks(())
plt.ylim(-1.25, 1.25)
#plt.yticks(())

添加文本,ha是横向居中对齐,va纵向底部(顶部)对齐

for x, y in zip(X, Y1):
    # ha: horizontal alignment
    # va: vertical alignment
    plt.text(x + 0.1, y + 0.05, '%.2f' % y, ha='center', va='bottom')

for x, y in zip(X, Y2):
    plt.text(x + 0.1, -y - 0.05, '%.2f' % y, ha='center', va='top')

在这里插入图片描述

等高线图

# x, y 分别是在区间 [-3,3] 中均匀分布的256个值
n = 256
x = np.linspace(-3,3,n)
y = np.linspace(-3,3,n)
# meshgrid在二维平面将每一个x和每一个y分别对应起来,编织成栅格
X,Y = np.meshgrid(x,y)

# 高度函数
def f(x,y):
    return (1 - x / 2 + x**5 + y**3) * np.exp(-x**2 - y**2)

# 使用函数plt.contourf进行颜色填充,位置参数分别为:X, Y, f(X,Y)
# 透明度0.75,并将 f(X,Y) 的值对应到color map的暖色组中寻找对应颜色
plt.contourf(X,Y,f(X,Y),8,alpha=.75,cmap=plt.cm.hot)
# 使用plt.contour绘制等高线,黑色线条,宽度0.5
c = plt.contour(X,Y,f(X,Y),8,color = 'black',linewidth = 0.5)

# inline控制是否将Label画在线里面,字体大小为10
plt.clabel(c, inline=True, fontsize=10)
plt.xticks(())
plt.yticks(())

在这里插入图片描述

2D图

绘制2D图像

#  3x3 的 2D-array 来表示点的颜色,每一个点就是一个pixel。
a = np.array([0.313660827978, 0.365348418405, 0.423733120134,
              0.365348418405, 0.439599930621, 0.525083754405,
              0.423733120134, 0.525083754405, 0.651536351379]).reshape(3,3)
plt.imshow(a, interpolation='nearest', cmap='bone', origin='lower')

interpolation内插法,以下为matplotlib官网上对于内插法的不同方法的描述,此处选择Nearest-neighbor 的方法
在这里插入图片描述
添加注释条

# shrink参数,使colorbar的长度变短为原来的92%:
plt.colorbar(shrink=0.92)
plt.xticks(())
plt.yticks(())
plt.show()

在这里插入图片描述

3D图

额外导入Axes3D显示3D坐标

import matplotlib.pyplot as plt
import numpy as np

# 导入Axes3D(3D坐标显示)
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()
ax = Axes3D(fig) # 在窗口上添加3D坐标轴
X = np.arange(-4,4,0.25)
Y = np.arange(-4,4,0.25)
X,Y = np.meshgrid(X,Y)
r = np.sqrt(X**2 + Y**2)
z = np.sin(r)
# rstride和cstride分别代表 row 和 column 的跨度
ax.plot_surface(X,Y,z,rstride=1, cstride=1, cmap=plt.get_cmap('rainbow'))
# 投影,zdir决定投影方向
ax.contourf(X, Y, z, zdir='z',offset=-1.3, cmap=plt.get_cmap('rainbow'))

在这里插入图片描述

(三) 多图subplot

  • plt.subplot:将图像窗口分成多个小窗口

多图均匀分布

import matplotlib.pyplot as plt
plt.figure() # 新建一个图像窗口

plt.subplot(2,2,1) # 将整个图像窗口分为2行2列,当前位置为1
plt.plot([0,1],[1,0])
plt.subplot(2,2,2)
plt.bar([0,1,2],[2,3,1])
plt.subplot(223)
plt.plot(list(np.arange(5)))
plt.subplot(224)
plt.bar(list(np.arange(3)),[1,2,3])
plt.show()

在这里插入图片描述

多图不均匀分布

import matplotlib.pyplot as plt
plt.figure() # 新建一个图像窗口

plt.subplot(2,1,1) # 将整个图像窗口分为2行1列,当前位置为1
plt.plot([0,1],[1,0])
plt.subplot(2,3,4) # 将整个图像窗口分为2行1列,当前位置为4,原先第1行列变成3列
plt.bar([0,1,2],[2,3,1])
plt.subplot(235)
plt.plot(list(np.arange(5)))
plt.subplot(236)
plt.bar(list(np.arange(3)),[1,2,3])
plt.show()

在这里插入图片描述

图中图

一个大图离有两个小图
在这里插入图片描述
大图绘制

fig = plt.figure()
x = [1, 2, 3, 4, 5, 6, 7]
y = [1, 3, 4, 2, 5, 8, 6]

# 4个值都是大图占整个figure坐标系的百分比
# 若figure大小为10*10,则大图(1,1)为起点,高8,宽8
left, bottom, width, height = 0.1, 0.1, 0.8, 0.8

# 将大图坐标系添加到figure中
ax1 = fig.add_axes([left, bottom, width, height])
ax1.plot(x,y,'r')
ax1.set_xlabel('x')
ax1.set_ylabel('y')
ax1.set_title('big')

小图绘制,更改坐标系位置和大小即可,plt也可以绘制

ax2 = fig.add_axes([0.2, 0.6, 0.25, 0.25])
ax2.plot(x,y,'b')
ax2.set_xlabel('x')
ax2.set_ylabel('y')
ax2.set_title('small 1')

plt.axes([0.6, 0.2, 0.25, 0.25])
plt.plot(y[::-1],x,'g')
plt.xlabel('x')
plt.ylabel('y')
plt.title('small 2')

两个y轴

x = np.arange(0, 10, 0.1)
y1 = 0.05 * x**2
y2 = -1 * y1

# 获取figure默认的坐标系 ax1
fig,ax1 = plt.subplots()
# 对ax1调用twinx()方法,生成如同镜面效果后的ax2
ax2 = ax1.twinx()

ax1.plot(x,y1,'g-')
ax1.set_xlabel('x data')
ax1.set_ylabel('y1 data',color='g')
ax2.plot(x,y2,'m')
ax2.set_ylabel('y2 data',color='m')
plt.show()

在这里插入图片描述

(四) 动画animation

具体参考matplotlib animation api

绘制0~2π内的正弦曲线的动态图像

import matplotlib.pyplot as plt
from matplotlib import animation
import numpy as np

fig,ax = plt.subplots()
x = np.arange(0,2*np.pi,0.01)
def animate(i):
    line.set_ydata(np.sin(x + i/10.0))
    return line,

def init():
    line.set_ydata(np.sin(x))

调用FuncAnimation函数生成动画,参数如下

  • fig :进行动画绘制的figure
  • func :自定义动画函数,即传入刚定义的函数animate
  • frames :动画长度,一次循环包含的帧数
  • init_func :自定义开始帧,即传入刚定义的函数init
  • interval: 更新频率,以ms计
  • blit: 选择更新所有点,还是仅更新产生变化的点。应选择True,mac用户选择False,否则无法显示动画
ani = animation.FuncAnimation(fig=fig,
                              func=animate,
                              frames=100,
                              init_func=init,
                              interval=20,
                              blit=False)
plt.show()

实为动图
在这里插入图片描述

(五)交互图ion

神经网络训练时需要动态看到loss的变化
参考:https://blog.csdn.net/weixin_42990464/article/details/112347386

  • plt.ion():开启交互模式
  • plt.ioff():关闭交互模式
  • plt.clf():清除当前figure
  • plt.cla():清除当前axes
  • plt.pause():暂停

注意show之前先用ioff关闭交互模式

import matplotlib.pyplot as plt
x = list(range(1, 21))  
loss = [2 / (i**2) for i in x]  

plt.ion()

def plot(ix,iy):
    plt.cla()
    plt.title("loss")
    plt.plot(ix, iy)
    plt.xlabel("epoch")
    plt.ylabel("loss")
    plt.pause(0.5)

for i in range(1, len(x)):
    ix = x[:i]
    iy = loss[:i]
    plot(ix,iy)

plt.ioff()
plt.show()

在这里插入图片描述

  • 24
    点赞
  • 99
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值