教程来源:https://www.bilibili.com/video/BV1Jx411L7LU
- 1 基本用法
- 1.1 画图初体验
- 1.2 figure图像
- 1.3 设置坐标轴(一)
- 1.4 设置坐标轴(二)
- 1.5 Legend图例
- 1.6 Annotation标注
- 2 绘制不同类型的图
- 2.1 Scatter散点图
- 2.2 Bar柱状图
- 2.3 Contours等高线图
- 2.3.1 没有轮廓线的等高线图(颜色填充图)
- 2.3.2 有轮廓线的等高线图(纯线图)
- 2.3.3 只画部分轮廓线
- 2.3.4 在轮廓线上注释出高度
基本用法跟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() # 用这个函数画的图才会显示出来
结果:
目标:
- 两个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() # 用这个函数画的图才会显示出来
结果:
1.3 设置坐标轴(一)补充:实测跟Matlab中的plot指令基本通用,可以直接用
目标:
- 设置横纵坐标的范围
- 设置横纵坐标轴的标签
- 设置横纵坐标轴的刻度
- 设置横纵坐标轴的刻度值
- 使用正则表达式输出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() # 用这个函数画的图才会显示出来
结果:
注意:
1.4 设置坐标轴(二)
- 最后r''为正则表达式,暂不清楚是干嘛的
- $ $表示中间为Latex格式
- 在Latex中,想要打出空格需要用转义字符+空格,可以看“really good”中间的空格
目标:
- 获取到图片的四个边框(四个轴)
- 让上方和右边的边框/轴消失
- 将下方的边框/轴的位置往上平移
有些复杂,用不太着,先跳过
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() # 用这个函数画的图才会显示出来
结果:
要实现的效果:
使用的命令:
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.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结果:
([]里面有几个颜色,就会按照顺序使用相应的颜色)
语法:等高线图的轮廓线
contour([X, Y,] Z, [levels], **kwargs)
函数各参数同contourf()中的各个参数,本函数特有的参数主要是关于线的属性
- linewidths:线宽,默认值为1.5
- linestyles:线型,默认正值为'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的结果:
如果想要之画出指定高度的轮廓线,在上面代码的基础上contour()函数做出如下改进
代码:只画规定高度的轮廓线(只画一条的时候,把plt.colorbar()关掉)
plt.contour(X,Y,f(X,Y),[0.4,0.8], #[]里面写出想要的高度
colors = 'red',
alpha=0.75)
结果:
想要在轮廓上进行注释,在画轮廓的时候,需要给contour()赋值:
CS = contour()
语法:轮廓线上的图注
clabel(CS, levels=None, **kwargs)
其中
- levels:可选项,需要注释的线,如果不给出,就认为所有的线都需要标出高度
- fontsize:字体大小,默认10.0
- colors:字体颜色
- 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() # 用这个函数画的图才会显示出来
结果:



