在三维空间中画一排线段,需要改一下方向,但是把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),并用它们来画出线段。