教程来源:https://www.bilibili.com/video/BV1Jx411L7LU
目录
1 基本用法
1.1 画图初体验
基本用法跟matlab一样,参考以下代码:
import matplotlib.pyplot as plt # 通常不会用到matplotlib的所有包,只需要plt即可
import numpy as np
x = np.linspace(-1,1,50)
y = 2 * x + 1
plt.plot(x,y)
plt.show() # 用这个函数画的图才会显示出来
结果:
1.2 figure图像
目标:
- 两个figure分别画图
- 自定义figure的名称及尺寸
- 同一个figure上画不同的曲线
- 自定义曲线的颜色,线宽,线形
代码:
import matplotlib.pyplot as plt # 通常不会用到matplotlib的所有包,只需要plt即可
import numpy as np
x = np.linspace(-1,1,50)
y1 = 2 * x + 1
y2 = x ** 2
plt.figure()
plt.plot(x,y1)
plt.figure(num=3,figsize=(8,5))
plt.plot(x,y2)
plt.plot(x,y1,color='red',linewidth=1.0,linestyle='--')
plt.show() # 用这个函数画的图才会显示出来
结果:
补充:实测跟Matlab中的
plot
指令基本通用,可以直接用
1.3 设置坐标轴(一)
目标:
- 设置横纵坐标的范围
- 设置横纵坐标轴的标签
- 设置横纵坐标轴的刻度
- 设置横纵坐标轴的刻度值
- 使用正则表达式输出Latex文本
代码:
import matplotlib.pyplot as plt # 通常不会用到matplotlib的所有包,只需要plt即可
import numpy as np
x = np.linspace(-3,3,50)
y1 = 2 * x + 1
y2 = x ** 2
plt.figure()
plt.plot(x,y2)
plt.plot(x,y1,color='red',linewidth=1.0,linestyle='--')
# 1. 设置横纵坐标的范围
plt.xlim((-1,2)) # 注意:这里范围需要再用一个括号括起来
plt.ylim((-2,3))
# 2. 设置横纵坐标轴的标签
plt.xlabel('I am x')
plt.ylabel('I am Y')
# 3. 设置横纵坐标轴的刻度
new_ticks = np.linspace(-1,2,5)
plt.xticks(new_ticks)
# 4. 设置横纵坐标轴的刻度值
# 5. 使用正则表达式输出Latex文本
plt.yticks([-2,-1.5,-1,1.22,3],
['really bad', r'$bad$','normal',r'$good$','$really\ good$'])
plt.show() # 用这个函数画的图才会显示出来
结果:
注意:
- 最后
r''
为正则表达式,暂不清楚是干嘛的$ $
表示中间为Latex格式- 在Latex中,想要打出空格需要用转义字符
\
+空格
,可以看“really good”中间的空格
1.4 设置坐标轴(二)
目标:
- 获取到图片的四个边框(四个轴)
- 让上方和右边的边框/轴消失
- 将下方的边框/轴的位置往上平移
有些复杂,用不太着,先跳过
1.5 Legend图例
-
在plot的时候,可以使用
plt.plot(x,y,label='XXX') plt.legend()
其中,
label
所输入的数就是图例中显示的名称 -
或者使用
legend
规定更详细的要求plt.legend(handles=[l1,l2,],labels=['aaa','bbb',],loc='upper right')
其中:
loc
表示图例出现的位置,可以选择的选项有“best”,其他竖直方向为“upper”,“center”,“lower”,水平方向为“left”,“center”,“right”,进行组合handles
表示在图例中是否显示相应的线型,使用之前需要确保plot是一下语句形式:
注意以上语句中的l1,= plt.plot(x1,y1,label='XXX') l2,= plt.plot(x2,y2,label='XXX')
,
以及handles=[l1,l2,]
中最后的逗号labels
表示图例的文本,如果前面的plot语句中也有文本,以这里为准。
实测使用时不需要这么麻烦,如果只想规定图例的文本,可以直接:
plt.legend(['aaa','bbb'])
如果还想规定位置,则
plt.legend(['aaa','bbb'],loc='upper right')
代码:上面的代码改进,只看最后几行图例的即可
import matplotlib.pyplot as plt # 通常不会用到matplotlib的所有包,只需要plt即可
import numpy as np
x = np.linspace(-3,3,50)
y1 = 2 * x + 1
y2 = x ** 2
plt.figure()
plt.plot(x,y2,label='function1')
plt.plot(x,y1,color='red',linewidth=1.0,linestyle='--',label='function2')
# 1. 设置横纵坐标的范围
plt.xlim((-1,2)) # 注意:这里范围需要再用一个括号括起来
plt.ylim((-2,3))
# 2. 设置横纵坐标轴的标签
plt.xlabel('I am x')
plt.ylabel('I am Y')
# 3. 设置横纵坐标轴的刻度
new_ticks = np.linspace(-1,2,5)
plt.xticks(new_ticks)
# 4. 设置横纵坐标轴的刻度值
# 5. 使用正则表达式输出Latex文本
plt.yticks([-2,-1.5,-1,1.22,3],
['really bad', r'$bad$','normal',r'$good$','$really\ good$'])
plt.legend(['aaa','bbb'],loc='best')
plt.show() # 用这个函数画的图才会显示出来
结果:
1.6 Annotation标注
要实现的效果:
使用的命令:
plt.annotate()
或
plt.text()
具体使用方法可再查阅,这里不详细展开
2 绘制不同类型的图
2.1 Scatter散点图
语法:
matplotlib.pyplot.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None,
vmin=None, vmax=None, alpha=None, linewidths=None, *, edgecolors=None,
plotnonfinite=False, data=None, **kwargs)
s
:每个点的大小c
:颜色cmap
:色彩映射表alpha
:透明度- 其余变量参见https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.scatter.html
示例代码:
import matplotlib.pyplot as plt # 通常不会用到matplotlib的所有包,只需要plt即可
import numpy as np
# 随机生成X,Y坐标
n = 1024 #规定点数
X = np.random.normal(0,1,n) #随机生成n个点,以正态分布,均值为0,标准差为1
Y = np.random.normal(0,1,n)
T = np.arctan2(Y,X) # 在颜色地图上找到对应的颜色
plt.scatter(X,Y,s=75,c=T,alpha=0.5)
plt.xlim((-1.5,1.5))
plt.ylim((-1.5,1.5))
plt.xticks(()) #取消坐标轴上的标尺显示
plt.yticks(())
plt.show() # 用这个函数画的图才会显示出来
结果:
2.2 Bar柱状图
先跳过
2.3 Contours等高线图
2.3.1 没有轮廓线的等高线图(颜色填充图)
语法:没有轮廓线的等高线图
contourf([X, Y,] Z, [levels], **kwargs)
其中
[X, Y]
:等高线图的横纵坐标,可以通过numpy.meshgrid()
生成Z
:等高线图的高度[levels]
:等高线分成几个层级,如果是0,则只有一条等高线分成两部分- 其他参数包括:
colors
:alpha
:透明度cmap
:色彩映射表,默认为viridis
,如果同时给出了colors
和cmap
,会报错norm
:可选项,如果使用色彩映射表,则 Normalize 实例会将级别值缩放到规范色彩映射表范围 [0, 1],以便映射到颜色。如果未给出,则使用默认线性缩放。vmin
,vmax
:可选项,如果不是 None,则这些值中的一个或两个都将提供给归一化实例,并覆盖基于[levels]
的默认色阶。- 其他参见https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.contourf.html
代码:(两种方式,用cmap和colors)
import matplotlib.pyplot as plt # 通常不会用到matplotlib的所有包,只需要plt即可
import numpy as np
def f(x, y):
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)
# 用cmap
# plt.contourf(X,Y,f(X,Y),
# levels = 8,
# alpha=0.75,
# cmap = plt.cm.viridis)
# 用colors
plt.contourf(X,Y,f(X,Y),
colors = ['red','blue','green','yellow'],
levels = 8,
alpha=0.75)
plt.colorbar()
plt.xticks(()) #取消坐标轴上的标尺显示
plt.yticks(())
plt.show() # 用这个函数画的图才会显示出来
结果:
用cmap
的结果:
用colors
结果:
([]
里面有几个颜色,就会按照顺序使用相应的颜色)
2.3.2 有轮廓线的等高线图(纯线图)
语法:等高线图的轮廓线
contour([X, Y,] Z, [levels], **kwargs)
函数各参数同contourf()
中的各个参数,本函数特有的参数主要是关于线的属性
linewidths
:线宽,默认值为1.5linestyles
:线型,默认正值为'dashed'
- 其他具体可参见https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.contour.html
代码:(也是cmap
和colors
的两种函数,只是上面的代码把contourf()
改成了contour()
)
import matplotlib.pyplot as plt # 通常不会用到matplotlib的所有包,只需要plt即可
import numpy as np
def f(x, y):
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)
# 用cmap
# plt.contour(X,Y,f(X,Y),
# levels = 8,
# alpha=0.75,
# cmap = plt.cm.viridis)
# 用colors
plt.contour(X,Y,f(X,Y),
colors = ['red','blue','green','yellow'],
levels = 8,
alpha=0.75)
plt.colorbar()
plt.xticks(()) #取消坐标轴上的标尺显示
plt.yticks(())
plt.show() # 用这个函数画的图才会显示出来
结果:
用cmap
的结果:
用colors
的结果:
2.3.3 只画部分轮廓线
如果想要之画出指定高度的轮廓线,在上面代码的基础上contour()
函数做出如下改进
代码:只画规定高度的轮廓线(只画一条的时候,把plt.colorbar()关掉)
plt.contour(X,Y,f(X,Y),[0.4,0.8], #[]里面写出想要的高度
colors = 'red',
alpha=0.75)
结果:
2.3.4 在轮廓线上注释出高度
想要在轮廓上进行注释,在画轮廓的时候,需要给contour()
赋值:
CS = contour()
语法:轮廓线上的图注
clabel(CS, levels=None, **kwargs)
其中
levels
:可选项,需要注释的线,如果不给出,就认为所有的线都需要标出高度fontsize
:字体大小,默认10.0colors
:字体颜色inline
:True或者是False,表示注释的高度是否在轮廓线里面(是否打断轮廓线)- 其他参见https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.clabel.html
代码:
import matplotlib.pyplot as plt # 通常不会用到matplotlib的所有包,只需要plt即可
import numpy as np
def f(x, y):
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)
# 用cmap
plt.contourf(X,Y,f(X,Y),
levels = 8,
alpha=0.75,
cmap = plt.cm.viridis)
plt.colorbar()
# 用colors
C = plt.contour(X,Y,f(X,Y),
levels = 8,
colors = 'black',
linewidths = 1.0,
alpha=0.75)
plt.clabel(C,colors = 'red', inline = True)
plt.xticks(()) #取消坐标轴上的标尺显示
plt.yticks(())
plt.show() # 用这个函数画的图才会显示出来
结果: