欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > python画图|3D errorbars基础教程

python画图|3D errorbars基础教程

2025/4/20 5:08:18 来源:https://blog.csdn.net/weixin_44855046/article/details/143799216  浏览:    关键词:python画图|3D errorbars基础教程

【1】引言

前序学习了errorbar()函数的大部分功能,相关文章包括但不限于下述链接:

python画图|errorbar初探_python ax.errorbar-CSDN博客

python画图|errorbar()进阶教程- uplims, lolims和xuplims, xlolims应用_ax.errorbar(x, y + 0.5, xerr=xerr, yerr=yerr, upli-CSDN博客

python画图|errorbar()函数中的errorevery参数-CSDN博客

在此基础上,我们尝试从二阶的平面图过渡到三阶的立体图,因此有了本文。

【2】官网教程

点击下方链接,直达官网,在官网可以看到非常精炼的代码,我们一起学习。

https://matplotlib.org/stable/gallery/mplot3d/errorbar3d.html#sphx-glr-gallery-mplot3d-errorbar3d-py

【3】代码解读

首先,引入画图和计算模块:

import matplotlib.pyplot as plt #引入画图模块
import numpy as np #引入计算模块

之后定义画三维图:

ax = plt.figure().add_subplot(projection='3d') #定义要画3D图

然后定义了自变量和因变量:

t = np.arange(0, 2*np.pi+.1, 0.01) #定义自变量
x, y, z = np.sin(t), np.cos(3*t), np.sin(5*t) #定义因变量

为表示谨慎,我想提前输出x、y和z的值。在这里,x取了正弦值,y取了余弦值,z取了另一个正弦值。

之后先定义了一个常数,然后对这个常数进行了取整和取余计算:

estep = 15 #定义一个常数
i = np.arange(t.size) #定义一个数组,数组的长度刚好等于自变量的长度
zuplims = (i % estep == 0) & (i // estep % 3 == 0) #定义一个新变量,定义一个新变量,变量对两个值进行判断
# i%estep为对estep取余数,i // estep % 3为对estep先取整数再对3取余数
zlolims = (i % estep == 0) & (i // estep % 3 == 2)#定义一个新变量,变量对两个值进行判断
# i%estep为对estep取余数,i // estep % 3为对estep先取整数再对3取余数

之后就是非常高效的直接绘制3D errorbar图形,误差在Z轴方向输出,通过上述和estep有关的计算控制误差输出的位置:

ax.errorbar(x, y, z, 0.2, zuplims=zuplims, zlolims=zlolims, errorevery=estep) #画图,这里在Z轴方向上进行误差输出ax.set_xlabel("X label") #设置X轴名称
ax.set_ylabel("Y label") #设置Y轴名称
ax.set_zlabel("Z label") #设置Z轴名称plt.show() #输出图形

运行代码后的图像为:

图1

此时的完整代码为:

import matplotlib.pyplot as plt #引入画图模块
import numpy as np #引入计算模块ax = plt.figure().add_subplot(projection='3d') #定义要画3D图# setting up a parametric curve
t = np.arange(0, 2*np.pi+.1, 0.01) #定义自变量
x, y, z = np.sin(t), np.cos(3*t), np.sin(5*t) #定义因变量estep = 15 #定义一个常数
i = np.arange(t.size) #定义一个数组,数组的长度刚好等于自变量的长度
zuplims = (i % estep == 0) & (i // estep % 3 == 0) #定义一个新变量,定义一个新变量,变量对两个值进行判断
# i%estep为对estep取余数,i // estep % 3为对estep先取整数再对3取余数
zlolims = (i % estep == 0) & (i // estep % 3 == 2)#定义一个新变量,变量对两个值进行判断
# i%estep为对estep取余数,i // estep % 3为对estep先取整数再对3取余数ax.errorbar(x, y, z, 0.2, zuplims=zuplims, zlolims=zlolims, errorevery=estep) #画图,这里在Z轴方向上进行误差输出ax.set_xlabel("X label") #设置X轴名称
ax.set_ylabel("Y label") #设置Y轴名称
ax.set_zlabel("Z label") #设置Z轴名称plt.show() #输出图形

【4】代码改写

其实默认输出图像看得比价凌乱,因此尝试修改变量定义,让图像简单一些:

x, y, z = np.sin(t), np.sin(3*t), np.sin(5*t) #定义因变量

此时的输出图像为:

图2

然后尝试在X轴上增加误差线,改下下述代码:

ax.errorbar(x, y, z, xerr=0.2,zerr=0.2,xuplims=zuplims, xlolims=zlolims,zuplims=zuplims, zlolims=zlolims, ecolor=['r','g'],errorevery=2*estep) #画图,这里在Z轴方向上进行误差输出

运行代码后的输出图像为:

图3

根据图3我们看到有的线条有箭头,有的线条没有箭头。为探索这个原因,我们先尝试保存代码如下:

import matplotlib.pyplot as plt #引入画图模块
import numpy as np #引入计算模块ax = plt.figure().add_subplot(projection='3d') #定义要画3D图# setting up a parametric curve
t = np.arange(0, 2*np.pi+.1, 0.01) #定义自变量
x, y, z = np.sin(t), np.sin(3*t), np.sin(5*t) #定义因变量estep = 15 #定义一个常数
i = np.arange(t.size) #定义一个数组,数组的长度刚好等于自变量的长度
zuplims = (i % estep == 0) & (i // estep % 3 == 0) #定义一个新变量,定义一个新变量,变量对两个值进行判断
# i%estep为对estep取余数,i // estep % 3为对estep先取整数再对3取余数
zlolims = (i % estep == 0) & (i // estep % 3 == 2)#定义一个新变量,变量对两个值进行判断
# i%estep为对estep取余数,i // estep % 3为对estep先取整数再对3取余数ax.errorbar(x, y, z, xerr=0.2,zerr=0.2,xuplims=zuplims, xlolims=zlolims,zuplims=zuplims, zlolims=zlolims, ecolor=['r','g'],errorevery=2*estep) #画图,这里在Z轴方向上进行误差输出ax.set_xlabel("X label") #设置X轴名称
ax.set_ylabel("Y label") #设置Y轴名称
ax.set_zlabel("Z label") #设置Z轴名称plt.show() #输出图形

然后改写变量定义代码,让取值变少:

t = np.arange(0, 2*np.pi+.1, 0.1) #定义自变量

此时的输出图像为:

图4

在这里我们不见看到没有箭头的十字交叉线,也看到有箭头的线居然出现了双箭头,为此继续改写代码:

ax.errorbar(x, y, z, xerr=0.5,zerr=0.2,xuplims=zuplims, xlolims=zlolims,zuplims=zuplims, zlolims=zlolims, ecolor=['r','g'],errorevery=2*estep) #画图,这里在Z轴方向上进行误差输出

先把xerr值扩大到0.5,运行代码后的图像为:

图5

可见,X轴方向的误差线长度增长,但是好像给同一条线的颜色给了两次赋值,为谨慎起见,先调换一下ecolor中的颜色代码g和r的顺序,调换后如下:

ecolor=['g','r']

运行代码后的输出图像为:

图6

可见颜色依然赋值了两次。

为继续简化图形,修改变量定义:

t = np.arange(0, 6.1, 0.1) #定义自变量
x, y, z = t, t, t #定义因变量

此时的变量大幅减少,输出图像也更简洁,运行代码后的图像为:

图7

在途7中我们观察到在右侧上方出现了一个红色的十字,为探究为何会出现这种情况,我们修正一下代码的密度,把输出间隔改到1,输出所有自变量,把estep改到2,。改后代码如下:

t = np.arange(0, 8.1, 1) #定义自变量
x, y, z = t, t, t #定义因变量
print('t=',t)
estep = 2 #定义一个常数

此时的完整代码为:

import matplotlib.pyplot as plt #引入画图模块
import numpy as np #引入计算模块ax = plt.figure().add_subplot(projection='3d') #定义要画3D图# setting up a parametric curve
t = np.arange(0, 8.1, 1) #定义自变量
x, y, z = t, t, t #定义因变量
print('t=',t)
estep = 2 #定义一个常数
i = np.arange(t.size) #定义一个数组,数组的长度刚好等于自变量的长度
zuplims = (i % estep == 0) & (i // estep % 3 == 0) #定义一个新变量,定义一个新变量,变量对两个值进行判断
# i%estep为对estep取余数,i // estep % 3为对estep先取整数再对3取余数
zlolims = (i % estep == 0) & (i // estep % 3 == 2)#定义一个新变量,变量对两个值进行判断
# i%estep为对estep取余数,i // estep % 3为对estep先取整数再对3取余数
print('zuplims=',zuplims)
print('zlolims=',zlolims)
ax.errorbar(x, y, z, xerr=0.5,zerr=0.2,xuplims=zuplims, xlolims=zlolims,zuplims=zuplims, zlolims=zlolims, errorevery=2*estep) #画图,这里在Z轴方向上进行误差输出ax.set_xlabel("X label") #设置X轴名称
ax.set_ylabel("Y label") #设置Y轴名称
ax.set_zlabel("Z label") #设置Z轴名称plt.show() #输出图形

运行代码后的输出图像为:

图8

同时输出的部分还包括:

t= [0. 1. 2. 3. 4. 5. 6. 7. 8.]
zuplims= [ True False False False False False  True False False]
zlolims= [False False False False  True False False False False]

注意到errorevery=2*estep=4,在此基础上:

当输出了九个变量,在输出第一个、第五个和第九个变量的时候指定了方向。

为便于理解,把zuplims和zlolims的值输出:

看着比较复杂,其实只用看三个值:第1个第5个和第9个。

第一个位置up=True,lo=Flase,应该显示负向的误差线;

第二个位置up=Flase,lo=True,应该显示正向的误差线;

第三个位置up=Flase,lo=Flase,应该显示正负向的误差线。

如对上述分析存疑,需从errorevery参数的意义着手开始加深理解,可通过下文辅助理解:

python画图|errorbar()函数中的errorevery参数-CSDN博客

【5】总结

掌握了3D errorbars绘制方法。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词