matplotlib知识

本文介绍了matplotlib库用于绘制神经网络训练和预测过程曲线的基本方法,包括figure画布、plot曲线、图例、坐标轴范围、刻度标签、散点图和3D图像等。通过多个示例展示了如何创建和定制图形,如设置曲线颜色、线型、刻度范围以及调整轴属性等。
摘要由CSDN通过智能技术生成

 为了绘画出神经网络在训练和预测过程的曲线,特地去学习matplotlib,在此总结之前学过的知识,按照代码+注释的方式进行学习。目前matplotlib的学习进展至中间部分,在之后我会更新完整。

大概有如下知识:

1.figure画布

2.用plot画一条曲线

3.图示legend

4.x和y的展示范围:xlim与ylim

5.x和y的名字:xlabel与ylabel

6.x和y的刻度和标签:xticks与yticks

7.设置x轴和y轴

8.用scatter描点

9.plot的另一种画直线方法

10.设置x轴和y轴刻度标签的字体大小和背景颜色

11.画散点图——用numpy建立点集,以及对应关系,用scatter展现

12.用scatter画散点直线

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.gridspec as gridspec
from mpl_toolkits.mplot3d import Axes3D

#   第一个例子,介绍figure与plot,并且绘制一条曲线
plt.figure(num="第一个", figsize=(8, 5))
#   确定一张画布,名字num为:第一个,大小figsize是8*5
x = np.linspace(-1, 1, 50)
#   用linspace确定x范围
y1 = 2*x - 1
plt.plot(x, y1, color='red', linewidth=1.0, linestyle='--')
#   以x和y,确定一条曲线,颜色color为red,线粗linewidth为1.0,线状linestyle为虚线
plt.show()
#   展示画布

#   第二个例子,介绍如何在一张画布绘制多条曲线,以及legend方法,除此之外,还有一些方法:xlim,ylim,xlabel,ylabel,xticks,yticks,最后介绍如何建立xy坐标轴
plt.figure(num="第二个", figsize=(8, 5))
x = np.linspace(-3, 3, 50)
y1 = 2*x + 1
y2 = x**2
line1, = plt.plot(x, y2, label='first')
#   通过多次调用plot,设置不同参数,可以画出多条曲线
#   plt.plot方法实际上是有返回值的,返回一个只有一个元素的列表,所以用变量接收的时候要逗号解包,这样就得到了曲线变量
#   另外,plot方法支持labels参数,可以设定这条曲线的注释
line2, = plt.plot(x, y1, color='red', linewidth='1.0', linestyle='--', label='second')
plt.legend(handles=[line1, line2, ], labels=['up', 'down'], loc='best')
#   所有设置过labels参数的曲线都可以直接通过legend方法直接实现,然而legend本身也是有三个参数的
#   legend方法有三个参数,handles接收列表,列表每个元素是前面接收plot返回的曲线的变量line1和line2
#   注意,列表最后要有一个括号,表示拆包。
#   labels参数也是一个列表,每个元素与handles参数一一对应,赋予曲线注释。
#   第三个参数loc,是图例放置的位置,一般默认设置成best就行。
#   注意,legend方法对图例操作的优先级大于plot的label方法,也就是说,在plot里设置了labelA,在legend方法里面,
#   也是可以重新设置label的,然后把之前plot设置的label覆盖掉。

plt.xlim((-1, 2))
#   控制x的展示范围
plt.ylim((-2, 3))
#   控制y的展示范围
plt.xlabel('i am x')
#   给x轴命名
plt.ylabel('i am y')
#   给y轴命名

new_ticks = np.linspace(-1, 2, 5)
plt.xticks(new_ticks)
#   xticks有两个参数,分别是刻度和标签,对于yticks也是一样,它们都是列表,刻度参数主要给x轴标刻度,可以通过linspace实现等分刻度,或者自建一个刻度
plt.yticks([-2, -1.8, -1, 1.22, 3], ['really bad', 'bad', 'normal', 'good', 'really good'])
#   第二个参数是标签参数,是一个列表,将前面对应的刻度标上label标签。

# gca = 'get current axis'即为得到画布的四个框
ax = plt.gca()
#   现在ax就是四个框
ax.spines['right'].set_color('none')
#   通过spines切片的方式,指定骨架,这里下标不再是数字,而是left,right,top,bottom
#   取消右框颜色,相当于隐藏右框,spines相当于骨架的意思,set_color意思是设定颜色
ax.spines['top'].set_color('none')
#   取消上框的颜色
ax.xaxis.set_ticks_position('bottom')
#   重新设定x轴为底框‘bottom’
ax.yaxis.set_ticks_position('left')
#   重新设定y轴为左框‘left’
ax.spines['bottom'].set_position(('data', 0))
#   用spines选定x轴bottom,然后用set_position以元组:('data',0)的方式,把x轴对齐y轴值为0的位置
ax.spines['left'].set_position(('data', 0))
#   同理,把y轴固定到x轴值为0的位置
#   这样,x轴和y轴就固定到原点了
plt.show()

#   第三个
x = np.linspace(-3, 3)
y = 2*x + 1
plt.figure(num="第四个", 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.yaxis.set_ticks_position('left')
ax.spines['bottom'].set_position(('data', 0))
#   指定x轴的位置,主要是一个元组作为参数,第一个元素默认都是'data',第二个参数是将x轴对齐y轴的哪个坐标,这里是对齐y轴的y=0坐标
ax.spines['left'].set_position(('data', 0))
#   同理

x0 = 1
y0 = 2*x0 + 1
plt.scatter(x0, y0, color='black')
#   使用scatter可以描点,如果是一个点,那么就输入x和y坐标值就行,如果是点集,那么输入点集的x坐标和y坐标就行
plt.plot([x0, x0], [y0, 0], 'r--', lw=2.5)
#   plot还可以根据两点一线设置直线,主要是两个参数发挥作用,分别为两点的x坐标和y坐标,这时候第三个参数是颜色+线状,r--表示红色虚线,第四个参数lw是线粗
plt.show()

#   第五个例子,介绍如何设置标签
x = np.linspace(-3, 3)
y = 0.1 * x
plt.figure(num="第五个", figsize=(8, 5))
plt.plot(x, y, linewidth=10, alpha=0.3)
#   plot还有个alpha参数,值的范围是从0到1,越大,越不透明,所以是透明度。
plt.ylim(-2, 2)
ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
ax.spines['bottom'].set_position(('data', 0))
ax.spines['left'].set_position(('data', 0))
#   已经是套路了

for label in ax.get_xticklabels() + ax.get_yticklabels():
    #   get_xticklabels还有get_yticklabels可以得到x轴和y轴的标签序列,然后用for循环就能一个个取出来
    label.set_fontsize(12)
    #   set_fontsize可以设置字体大小
    label.set_bbox(dict(facecolor='grey', edgecolor='none', alpha=0.7))
    #   set_bbox是设置标签框的方法,要传一个字典,facecolor是前景色,edgecolor是边框的颜色,alpha是透明度,越大越不透明

plt.show()

#   第六个例子,告诉我们如何画散点图,只需要有两个点集,建立起函数关系,就能有散点图
plt.figure(num='第六个', figsize=(8, 5))
n = 1024
X = np.random.normal(0, 1, n)
Y = np.random.normal(0, 1, n)
#   第一步,为了获得点集,我们将会使用正态分布
#   np.random.noraml函数将会得到高斯分布的点集,参数为三个,第一个是均值mean,第二个是标准差std,第三个是点的个数n,这里设置了正态分布,当然也是最常用的分布
T = np.arctan2(Y, X)
#   第二步,将两个点集建立反正切函数关系
plt.scatter(X, Y, s=75, c=T, alpha=0.5)
#   第三步,输入点集x坐标和y坐标
plt.xlim((-1.5, 1.5))
plt.ylim((-1.5, 1.5))
plt.xticks(())
plt.yticks(())
#   不展示x和y的标签
plt.show()

#   第七个,告诉我们画散点图中几个特例:直线和曲线散点
plt.figure(num="第七个", figsize=(8, 5))
x = np.arange(50)
y1 = np.arange(50)*np.arange(50)
y2 = 3*np.arange(50)
plt.scatter(x, y1)
plt.scatter(x, y2)
#   绘画散点曲线,关键是用arange即可生成散点序列,第一个参数是x,第二个参数是y
plt.xticks()
plt.yticks()
plt.show()

plt.figure(num="第八个")
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='#66ccff', edgecolor='white')
plt.bar(X, -Y1, facecolor='#ff9999', edgecolor='white')

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

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

#   第九个,等值线
plt.figure(num="第九个")


def f(x, y):
    #   the value function
    return (1 - x / 2 + x**5 + y**3) * np.exp(-x**2 - y**2)


n = 256
x = np.linspace(-3, 3, n)
y = np.linspace(-3, 3, n)
X, Y = np.meshgrid(x, y)
#   等值线的平面是一个网格图,前面的linspace只是生成了一串等距值,还没有构造一个网格平面。因此必须用meshgrid绘制一个网格平面。
plt.contourf(X, Y, f(X, Y), alpha=0.75, cmap='hot')
#   填充颜色,hot是热力图,cool是冷力图
C = plt.contour(X, Y, f(X, Y), colors='black', linewidths=1)
#   绘制等值线,可以设定等值线的颜色和线粗
plt.clabel(C, inline=True, fontsize=10)
#   clabel给等值线标上文字描述,inline表示文字在线内还是线外,True是线内。fontsize表示文字大小
plt.xticks(())
plt.yticks(())
#   取消xy轴标签,也就是隐藏x和y轴
plt.show()

#   第十个,图像
plt.figure(num="第十个")
a = np.array([[0.2, 0.35, 0.41],
              [0.39, 0.43, 0.54],
              [0.42, 0.56, 0.6]])
plt.imshow(a, interpolation='nearest', cmap='bone', origin='upper')
#   imshow将矩阵的每个值对应上灰白色,越接近1,越白。interpolation表示模糊度,一般设置为nearest表示最清晰,cmap设置为bone表示灰白图
plt.colorbar(shrink=0.9)
#   展示图例,表示颜色和数值的对应关系,shrink默认参数为1,表示和图像一样高,越接近1,图例越高,越接近0,图例越矮
plt.xticks(())
plt.yticks(())
plt.show()

#   第十一个,3d数据
myfig = plt.figure()
ax = myfig.add_axes(Axes3D(myfig))
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)

ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap="rainbow", edgecolor="black")
ax.contourf(X, Y, Z, offset=-2, cmap="rainbow")
ax.set_zlim(-2, 2)
ax.set_xlim(-4, 4)
ax.set_ylim(-4, 4)
plt.show()

#   subplot实现多分区图像
plt.figure(num="第十二个", figsize=(8, 8))
plt.suptitle("learning curve of subplot")
#   使用suptitle给整个幕布生成名字
plt.subplot(2, 2, 1)
#   用subplot指定分格显示的布局,参数是:行数,列数,序号
x = np.linspace(-3, 3)
#   使用linspace生成等差序列,类型是ndarray类型,可以作为plot的参数
y = 3*x
plt.plot(x, y)
plt.title("plot of 3x")
#   用title给局部图像命名

plt.subplot(2, 2, 2)
x = np.linspace(-5, 5)
y = x*x
plt.plot(x, y)
plt.title("plot of x*x")

plt.subplot(2, 2, 3)
x = np.linspace(-10, 10)
y = np.sin(x)
plt.plot(x, y)
plt.title("plot of sinx")

plt.subplot(2, 2, 4)
x = np.linspace(-4, 4)
y = np.tan(x)
plt.plot(x, y)
plt.title("plot of tanx")

plt.show()

#   第十三个,用gridspec实现多分区图像

#   第十四个,首先获得坐标轴的实例,然后用twinx和twiny共享坐标轴

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值