为了绘画出神经网络在训练和预测过程的曲线,特地去学习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共享坐标轴