matplotlib set_data() 在下一次绘制时不更新绘图()

问题描述

我在 3D 绘图的一面墙上放置了一个 2D 绘图,它似乎没有反映 set_data() 的任何变化,我想了解我在这里做错了什么。

这是一个示例代码显示了带有相关 2D“投影”图的 3D 图。 The output is shown here:

from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['legend.fontsize'] = 10

fig = plt.figure()
ax = fig.gca(projection='3d')

# Test data for projection onto xz plane
t = linspace(0,10,num=20)
z = np.sin(t)

# Plot projection
projx,= ax.plot(np.linspace(-1,num=len(z)),z,'r',zdir='y',zs=1)

# Labels and scaling
ax.set_xlabel('M_x')
ax.set_ylabel('M_y')
ax.set_zlabel('M_z')
ax.set_xlim(-1,1)
ax.set_ylim(-1,1)
ax.set_zlim(-1,1)

# Update projection data
projx.set_data([0],[0])

# See if actually updated data
print(projx.get_xdata())

# Draw and display window
plt.draw()
ax.legend()

plt.show()

我想象这一行:

projx.set_data([0],[0])

会使投影图几乎为空。相反,正弦波仍然存在。

此外,打印输出如预期的那样产生 [0],因此 set_data() 调用成功,但由于某种原因,绘图没有使用新数据绘制。

set_data() 的变化不应该在之后绘制时反映出来吗?

解决方法

有一种方法可以通过直接设置顶点来更新 Line3D 对象。不过,不确定这是否会产生任何负面影响。

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.gca(projection='3d')

# Test data for projection onto xz plane
t = np.linspace(0,10,num=20)
z = np.sin(t)

# Plot projections
projx,= ax.plot(np.linspace(-1,num=len(z)),z,'r',zdir='y',zs=1,label="changed")
projy,'b',zdir='x',zs=-1,label="not changed")

# Labels and scaling
ax.set_xlabel('M_x')
ax.set_ylabel('M_y')
ax.set_zlabel('M_z')
ax.set_xlim(-1,1)
ax.set_ylim(-1,1)
ax.set_zlim(-1,1)

#update vertices of one Line3D object
projx._verts3d = [0,0.2,0.7],[1,1,1],[0.5,0.7]

ax.legend()
plt.show()

示例输出: enter image description here

但是,由于不能省略 xyz 数组中的任何一个,因此与将其绘制为一个数组为常量的 3D 数组相比,并没有真正的优势.

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...