【问题标题】:Adding errorbars to 3D plot in matplotlib在 matplotlib 中向 3D 绘图添加误差线
【发布时间】:2014-12-02 10:29:22
【问题描述】:

我找不到在 matplotlib 的 3D 散点图中绘制误差线的方法。 基本上,对于下面这段代码

from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
X, Y, Z = axes3d.get_test_data(1)
ax.scatter(X, Y, zs = Z, zdir = 'z')

我正在寻找类似的东西

ax.errorbar(X,Y, zs = Z, dY, dX, zserr = dZ)

有没有办法在 mplot3d 中做到这一点?如果没有,还有其他库有这个功能吗?

【问题讨论】:

  • 我认为您必须自己在每个点周围画一些小线,或者尝试使用 3D 箭袋来绘制误差线
  • 这当然是一种解决方法,我会记住它作为最后的手段。
  • 非常值得在 matplotlib 论坛上取得联系,可能已经在开发这样的功能。如果没有,并且您制定了合理的解决方法,我相信他们会很高兴收到您的来信。

标签: python matplotlib 3d


【解决方案1】:

论坛http://mple.m-artwork.eu/home/posts/simple3dplotwith3derrorbars有明显例子

这是代码,但不是内置功能:

import numpy as np
import matplotlib.pyplot as plt
import mpl_toolkits.mplot3d.axes3d as axes3d

fig = plt.figure(dpi=100)
ax = fig.add_subplot(111, projection='3d')



#data
fx = [0.673574075,0.727952994,0.6746285]
fy = [0.331657721,0.447817839,0.37733386]
fz = [18.13629648,8.620699842,9.807536512]

#error data
xerror = [0.041504064,0.02402152,0.059383144]
yerror = [0.015649804,0.12643117,0.068676131]
zerror = [3.677693713,1.345712547,0.724095592]

#plot points
ax.plot(fx, fy, fz, linestyle="None", marker="o")

#plot errorbars
for i in np.arange(0, len(fx)):
    ax.plot([fx[i]+xerror[i], fx[i]-xerror[i]], [fy[i], fy[i]], [fz[i], fz[i]], marker="_")
    ax.plot([fx[i], fx[i]], [fy[i]+yerror[i], fy[i]-yerror[i]], [fz[i], fz[i]], marker="_")
    ax.plot([fx[i], fx[i]], [fy[i], fy[i]], [fz[i]+zerror[i], fz[i]-zerror[i]], marker="_")

#configure axes
ax.set_xlim3d(0.55, 0.8)
ax.set_ylim3d(0.2, 0.5)
ax.set_zlim3d(8, 19)

plt.show()

【讨论】:

  • 是的,以这种方式绘制误差线似乎仍然是唯一的方法。这是一个非常简洁的示例,我会将其标记为已接受。
【解决方案2】:

我最终为matplotlib: official example for 3D errorbars: 编写了方法:

import matplotlib.pyplot as plt
import numpy as np

ax = plt.figure().add_subplot(projection='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)
zlolims = (i % estep == 0) & (i // estep % 3 == 2)

ax.errorbar(x, y, z, 0.2, zuplims=zuplims, zlolims=zlolims, errorevery=estep)

ax.set_xlabel("X label")
ax.set_ylabel("Y label")
ax.set_zlabel("Z label")

plt.show()

【讨论】:

    猜你喜欢
    • 2020-03-12
    • 2021-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-27
    • 1970-01-01
    • 2013-11-18
    • 2020-09-08
    相关资源
    最近更新 更多