【问题标题】:How to scale and set up RGB ortogonal axes in a 3D plot?如何在 3D 图中缩放和设置 RGB 正交轴?
【发布时间】:2020-04-23 05:34:07
【问题描述】:

我试图在一维上绘制波函数,但它有实部和虚部,所以我做了一个 3D 绘图动画。这是截图:

我想做的主要事情是将它沿着 x 轴(现在是垂直的)展开,这样它看起来就不会被挤压。此外,最好将其设置在一组 3 个 RGB 轴中,这些轴在点 (0,0,0) 处相交。在文档中,我找不到任何直接的方法来做到这一点。我附上了我用来制作动画的代码部分:

import matplotlib.pyplot as plt
import matplotlib.animation as animation
import mpl_toolkits.mplot3d.axes3d as p3

fig = plt.figure()
ax = fig.gca(projection='3d')
line, = ax.plot(REAL[0,:],IMAG[0,:],x,"r",linewidth=0.5)

def animacio(i):
    ax.collections.clear()
    line.set_data(REAL[i,:],IMAG[i,:])
    line.set_3d_properties(x, 'z')
    return line,

ani = animation.FuncAnimation(fig,animacio,interval=50, frames=Nt,repeat=True)
nom = 'Evolució_'
ani.save(str(nom)+'['+str(V0)+','+str(L)+','+str(l)+','+str(xi)+','+str(sigmax)+','+str(T)+']'+'.mp4', writer="ffmpeg", dpi=300)
plt.show()

print('Animation saved as: '+str(nom)+'['+str(V0)+','+str(L)+','+str(l)+','+str(xi)+','+str(sigmax)+','+str(T)+']'+'.mp4')

【问题讨论】:

  • PS:使用 f-strings (python 3.6),你可以写 nom_complet = f'{nom}[{V0},{L},{l},{xi},{sigmax},{T}].mp4'
  • 能否分享生成类似曲线的代码?它有助于提供真正适合您的案例的答案。
  • 感谢您提供有关名称的提示!当然可以分享!但是代码有点长,要不要编辑问题添加一下?
  • 也许this post 也有帮助? This article 提供了一些关于 3D 动画的想法。
  • This post 处理多色

标签: python matplotlib animation data-visualization complex-numbers


【解决方案1】:

您可以在绘图中添加彩色线条,只需给出起点和终点并指定颜色即可。 “上”轴的限制可以由ax.set_zlim 设置。我创建了一个与您的大致相似的演示曲线。

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

x = np.linspace(-10, 10, 1000)
y = np.sin(10*x)/(x*x+1)
z = np.cos(10*x)/(x*x+1)
ax = plt.axes(projection='3d')
ax.plot3D([0,0], [0,0], [-10,10], color='crimson')
ax.plot3D([0,0], [-1,1], [0,0], color='limegreen')
ax.plot3D([-1,1], [0,0], [0,0], color='dodgerblue')
line, = ax.plot3D(y, z, x, color='blueviolet')
ax.set_zlim(-1, 1)
plt.show()

左边的情节没有限制,右边有限制:

要获得更细长的视图,您可以使用以下内容:

plt.gcf().set_size_inches(4, 12)

【讨论】:

  • 非常类似于曲线,但我希望在 x 轴上显示整个范围的同时展开它,以使绘图的体积变得更像一个矩形框,做你知道 matplotlib 是否可以做到这一点?
  • 要么手动更改周围的窗口,要么使用plt.gcf().set_size_inches(4, 12) 对其进行编程
  • 如果我得到正确的相机角度,这种工作方式,但它真正做的是拉长图像,如你所说。通过这样做,其他轴上的比例就会丢失。
  • This post您在其中一个答案中评论了主要问题,通过在代码中添加一行来顺利解决问题:ax.get_proj = lambda: np.dot(Axes3D.get_proj(ax), np.diag([0.2, 0.2, 1, 1]))
  • 谢谢!或ax.get_proj = lambda: np.dot(Axes3D.get_proj(ax), np.diag([0.3, 0.3, 1.5, 1])) 以不要将尺寸减小太多。
猜你喜欢
  • 2020-12-07
  • 2016-05-07
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 2022-11-22
  • 2020-04-07
  • 2013-08-13
  • 1970-01-01
相关资源
最近更新 更多