3D出图错误matplotlib

在三维空间中画一排线段,需要改一下方向,但是把for循环中的zs与ys交换后就报错ValueError: input operand has more dimensions than allowed by the axis remapping
理论上说原来xs,ys,zs = zip(*point_pairs)就能正常出图,但是改成xs,zs,ys = zip(*point_pairs)为啥就不行了啊!救命啊,卡了一天了!


import numpy as np
import math
from numpy import *
from numpy.linalg import norm
import scipy.optimize as optimize
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import matplotlib as mpl
from matplotlib.font_manager import FontProperties
from matplotlib import rc, rcParams
import os.path
np.seterr(divide='ignore',invalid='ignore')
from mpl_toolkits.mplot3d import Axes3D

from matplotlib.pyplot import MultipleLocator

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

pos3=np.array([[0., np.linspace(-5.,5., 70), -5]])
pos4=np.array([[0., np.linspace(-5.,5., 70),  5]])

for point_pairs in zip(pos3, pos4):
    
    xs,zs,ys = zip(*point_pairs)
    #下面是原来的顺序,就能正常出图,ys与zs换了顺序之后为啥就不行了啊
    #xs,ys,zs = zip(*point_pairs)
    #ax.plot(xs, ys, zs)
    ax.plot(xs,ys,zs,  color='b')

ax.set_xlim(0,10)
ax.set_ylim(-5,5)
ax.set_zlim(-5,5)

ax.set_xlabel('x ($\mu$m)',fontsize=20 ,labelpad = 20)
ax.set_ylabel('z ($\mu$m)',fontsize=20 ,labelpad = 20)
ax.set_zlabel('y ($\mu$m)',fontsize=20 ,labelpad = 20)



plt.show()



ChatGPT尝试回答您的问题,仅供参考
在这行代码:

xs,zs,ys = zip(*point_pairs)

你把 ys 和 zs 交换了顺序,但是在这一行代码之后使用了 xs, ys, zs:

ax.plot(xs,ys,zs,  color='b')

因此,把 ys 和 zs 交换顺序后,这一行代码的意思就变成了画出一条线段,它的 $x$ 坐标由 xs 给出,$y$ 坐标由 zs 给出,$z$ 坐标由 ys 给出。


但是,在定义坐标轴的时候,你把 $y$ 轴定义成了 $z$ 轴,$z$ 轴定义成了 $y$ 轴。因此,把 ys 和 zs 交换顺序后,你实际上是在画出一条线段,它的 $x$ 坐标由 xs 给出,$y$ 坐标由 ys 给出,$z$ 坐标由 zs 给出。但是,由于你把坐标轴定义错误了,因此画出来的线段并不是你想要的。


要解决这个问题,你需要修改代码如下:

  • 修改坐标轴的定义,使得 $y$ 轴变成 $y$ 轴,$z$ 轴变成 $z$ 轴。

  • 在画线段的时候,使用正确的坐标轴,即 $x$ 坐标由 xs 给出,$y$ 坐标由 ys 给出,$z$ 坐标由 zs 给出。


那么,为了解决这个问题,你可以这样修改你的代码:

首先,修改坐标轴的定义:

ax.set_xlabel('x ($\mu$m)',fontsize=20 ,labelpad = 20)
ax.set_ylabel('y ($\mu$m)',fontsize=20 ,labelpad = 20)
ax.set_zlabel('z ($\mu$m)',fontsize=20 ,labelpad = 20)

然后,修改画线段的代码,使用正确的坐标轴:

xs,ys,zs = zip(*point_pairs)
ax.plot(xs, ys, zs, color='b')

这样,你就可以正确地在三维空间中画出一排线段了。


注意:在这段代码中,你使用了 zip 函数来将两个数组中的元素配对,并使用 * 操作符来解压缩这些配对的元素。这样,你就可以通过单独的变量来访问每对元素中的第一个元素(例如 xs)和第二个元素(例如 ys),并用它们来画出线段。