pythonmatplotlibcontour 画等⾼线图
#导⼊模块
import numpy as np
import matplotlib.pyplot as plt
#建⽴步长为0.01,即每隔0.01取⼀个点
step = 0.01
x = np.arange(-10,10,step)
y = np.arange(-10,10,step)
#也可以⽤x = np.linspace(-10,10,100)表⽰从-10到10,分100份
#将原始数据变成⽹格数据形式
X,Y = np.meshgrid(x,y)
#写⼊函数,z 是⼤写
Z = X**2+Y**2
#设置打开画布⼤⼩,长10,宽6
#plt.figure(figsize=(10,6))
#填充颜⾊,f 即filled
#画等⾼线
plt.show()
结果如下
颜⾊越深表⽰值越⼩,中间的⿊⾊表⽰z=0.
当然,也可以不要颜⾊填充,并只希望输出z=20和z=40两条线,则在上⾯代码的基础上,将urf去掉,并:
函数画图
以z=x2+y2为例
z =x 2+y 2z =x 2+y 2z =x +2y 2#只画z=20和40的线,并将颜⾊设置为⿊⾊
contour = ur(X,Y,Z,[20,40],colors='k')
#等⾼线上标明z (即⾼度)的值,字体⼤⼩是10,颜⾊分别是⿊⾊和红⾊
plt.clabel(contour,fontsize=10,colors=('k','r'))linspace numpy
结果如下:
默认是保留3个⼩数,可以如下保留四位
以下,我将⼀些常⽤的功能补充全代码,如下:
#导⼊模块
import numpy as np
import matplotlib.pyplot as plt
#建⽴步长为0.01,即每隔0.01取⼀个点
step = 0.01
x = np.arange(-10,10,step)
y = np.arange(-10,10,step)
#也可以⽤x = np.linspace(-10,10,100)表⽰从-10到10,分100份
#将原始数据变成⽹格数据形式
X,Y = np.meshgrid(x,y)
#写⼊函数,z 是⼤写,这⾥我让中间的0是最⼤,加了⼀个负号
Z = -(X**2+Y**2)
#填充颜⾊,f 即filled,6表⽰将三⾊分成三层,cmap 那⼉是放置颜⾊格式,hot 表⽰热温图(红黄渐变)
#更多颜⾊图参考:blog.csdn/mr_cat123/article/details/80709099
#颜⾊集,6层颜⾊,默认的情况不⽤写颜⾊层数,
cset = urf(X,Y,Z,6,hot)
#or cmap='hot'
#画出8条线,并将颜⾊设置为⿊⾊
contour = ur(X,Y,Z,8,colors='k')
#等⾼线上标明z (即⾼度)的值,字体⼤⼩是10,颜⾊分别是⿊⾊和红⾊
plt.clabel(contour,fontsize=10,colors='k')
#去掉坐标轴刻度
#icks(())
#icks(())
#设置颜⾊条,(显⽰在图⽚右边)
#显⽰plt.show()颜⾊取反
plt.clabel(contour,fontsize=10,colors=('k','r'),fmt='%.4f')
上⾯展⽰的是值越⼤越⽩,如果想要让红⾊在内,则只要在颜⾊名称后加_r即可。其他颜⾊映射也是如此cmap='hor_r'
数据画图
如果是已经有第三维(即⾼)的数据,那么可以通过数据来画图
这⾥先对id作⼀个解释:
可以看到建⽴了⼀个⼆维平⾯,详细见:
⽐如有:
z = x**2 + y
⽽z是已经获得的数据,那么如何通过数据将z看成⾼呢?
import numpy as np
import matplotlib.pyplot as plt
z_list = []
for y in range(3):
for x in range(3):
z = x**2+y
z_list.append(z)    #获得z的数据
z = z_list
x = np.linspace(0,2,3)
y = np.linspace(0,2,3)
[X,Y] = np.meshgrid(x,y)  #⽣成X,Y画布,X,Y都是3*3
#因为z是⼀维,所以要变成3*3
z = np.mat(z)
z = np.array(z)
z.shape = (3,3)
#画图(建议⼀定要查看X,Y,z是不是⼀⼀对应了)
plt.figure(figsize=(10,6))
这⾥输出X,Y和z如下,已经⼀⼀对应。
当x=0,y=0,则z=0
当x=0,y=1,则z=1
当x=0,y=2,则z=2
注意:我上⾯是⽤的先for y in xxx,再for x in xxx。
另外,也可以输出x,和y统⼀操作⽽不需要再写,也不需要⽤meshgrid函数如下:
x = np.linspace(xxx)
import numpy as np
import matplotlib.pyplot as plt
z_list = []
x_list = []
y_list = []
for x in range(3):
for y in range(3):
z = x**2+y
z_list.append(z)
x_list.append(x)
y_list.append(y)
x,y,z = x_list,y_list,z_list
#对x操作
x = np.array(x)  #将list变成array
x.shape = (3,3)  #重新分成3*3的array
x = np.mat(x).T  #变成矩阵并转置,因为array没有转置
#对y操作
y = np.array(y)
y.shape = (3,3)
y = np.mat(y).T
#对z操作
z = np.array(z)
z.shape = (3,3)
z = np.mat(z).T
#画图
plt.figure(figsize=(6,4))
选择性画图
如果我只想画出等⾼线某些部分的线,⽐如想画⾼为0.00221,和0.00223的线,那么可以使⽤下⾯命令contour = ur(X,Y,Z,[0.00221,0.00223],colors='k')

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。