前期已经学习了大量的python画图教程,但颜色的设计一直是次要角色,今天我们就一起学习一下如何对图形分段设置颜色。
一些前期通过颜色区分图形的文章链接如下:
python画图|极坐标下的3D surface_python 根据经纬度 海拔高度 绘制三维立体-CSDN博客
python画图|极坐标中画直方图_ax1.plot()怎么画直方图-CSDN博客
【1】官网教程
首先打开官网教程,学习曲线分段颜色设置:
https://matplotlib.org/stable/gallery/color/color_by_yvalue.html
官网教程的代码非常简单,因此尝试做了注解。
【2】代码解读
首先是计算模块numpy和绘图模块matplotlib的引入。
import matplotlib.pyplot as plt #引入matplotlib模块画图 import numpy as np #引入numpy模块做数学计算
然后简单定义了变量:
t = np.arange(0.0, 2.0, 0.01) #定义自变量 s = np.sin(2 * np.pi * t) #定义因变量
之后设定了曲线颜色分段的上下标准:
upper = 0.77 #定义上标准线 lower = -0.77 #定义下标准线
再之后定义了如何将曲线划分为3段,使用了np.ma.masked_where()函数:
supper = np.ma.masked_where(s < upper, s) #输出大于upper的值 slower = np.ma.masked_where(s > lower, s) #输出小于lower的值 smiddle = np.ma.masked_where((s < lower) | (s > upper), s) #输出介于(lower,upper)之间的值
supper取到比upper大的值;
slower取到比lower小的值;
smiddle取到介于lower和upper之间的值。
基于上述三个操作,实现将曲线分为三段。
最后定义了画图和输出图形:
fig, ax = plt.subplots() #定义画图 ax.plot(t, smiddle, t, slower, t, supper) #定义画所有图形 plt.show() #输出图形
最后的输出图形为:
图1
至此,完整代码加注释为:
import matplotlib.pyplot as plt #引入matplotlib模块画图
import numpy as np #引入numpy模块做数学计算
t = np.arange(0.0, 2.0, 0.01) #定义自变量
s = np.sin(2 * np.pi * t) #定义因变量
upper = 0.77 #定义上标准线
lower = -0.77 #定义下标准线
supper = np.ma.masked_where(s < upper, s) #输出大于upper的值
slower = np.ma.masked_where(s > lower, s) #输出小于lower的值
smiddle = np.ma.masked_where((s < lower) | (s > upper), s) #输出介于(lower,upper)之间的值
fig, ax = plt.subplots() #定义画图
ax.plot(t, smiddle, t, slower, t, supper) #定义画所有图形
plt.show() #输出图形
【3】代码修改
【3.1】np.ma.masked_where()函数
由前述分析可知,np.ma.masked_where()函数可实现对函数分段。
为测试该功能,在编辑器(比如pycharm)中输入以下代码:
import matplotlib.pyplot as plt #引入matplotlib模块画图
import numpy as np #引入numpy模块做数学计算
t = np.arange(0.0, 6.0, 1) #定义自变量
s = 2*t #定义因变量
upper = 6 #定义上标准线
lower = 2 #定义下标准线
supper = np.ma.masked_where(s < upper, t) #输出大于upper的值
slower = np.ma.masked_where(s > lower, s) #输出小于lower的值
smiddle = np.ma.masked_where((s < lower) | (s > upper), s) #输出介于(lower,upper)之间的值
print('supper=\n',supper)
print('slower=\n',slower)
print('smiddle=\n',smiddle)
在这里,首先是将自变量t的取值范围限定在[0,1,2,3,4,5]之间,对应s的取值范围为[0,2,4,6,8,10]。
supper的取值为:当s<upper时,输出s对应t的部分,但这一部分t所对应的s>upper。
这个理解有一些绕,换个说法:当s<upper时,有效的s值应满足s>upper。
紧接着我们对slower做了测试:我们尝试输出比slower还要小的值,判断条件要写s>slower。
运行程序,输出结果为:
supper=
[-- -- -- 3.0 4.0 5.0]
slower=
[0.0 2.0 -- -- -- --]
所以, np.ma.masked_where()函数其实是取判断条件的补集,或者说是反面。
【3.2】ax.plot()函数
在官网代码中,最后的输出是按照多个(自变量,因变量)的形式直接写入ax.plot()函数的:
ax.plot(t, smiddle, t, slower, t, supper) #定义画所有图形
因此尝试直接输出【3.1】节中的结果。
首先是单独输出upper、lower和middle,最后直接全部一起输出,为便于对比,给各个图形进行了命名。
此时的完整代码为:
import matplotlib.pyplot as plt #引入matplotlib模块画图
import numpy as np #引入numpy模块做数学计算
t = np.arange(0.0, 6.0, 1) #定义自变量
s = 2*t #定义因变量
upper = 6 #定义上标准线
lower = 2 #定义下标准线
supper = np.ma.masked_where(s < upper, t) #输出大于upper的值
slower = np.ma.masked_where(s > lower, s) #输出小于lower的值
smiddle = np.ma.masked_where((s < lower) | (s > upper), s) #输出介于(lower,upper)之间的值
print('supper=\n',supper)
print('slower=\n',slower)
print('smiddle=\n',smiddle)
fig, [ax1,ax2,ax3,ax4] = plt.subplots(1,4)
ax1.plot(t, smiddle) #, t, slower, t, supper
ax1.set_title('smiddle')
ax2.plot(t, slower) #, t, slower, t, supper
ax2.set_title('slower')
ax3.plot(t, supper) #, t, slower, t, supper
ax3.set_title('supper')
ax4.plot(t, supper, t, slower, t, smiddle)
ax4.set_title('all')
plt.show()
输出结果为:
图2
可见:
当一个坐标轴中有多个图形时,ax.plot()函数函数会自动给图形规划不同的颜色。
【4】总结
学习了曲线分段设置颜色基础教程,探讨了np.ma.masked_where()函数和ax.plot()函数的作用。