Когда я строю куб, 3 оси увеличиваются по-разному, и кажется, что самые длинные оси Z - самые короткие, что означает, что его форма изменена и выглядит странно
форма, которую я получаю от питона.
что я хочу получить
Я собираюсь построить 3d-куб с питоном. Оси куба: a = ['6.1290000000000049', '0.0000000000000000', '0.0000000000000000'], b = ['- 3.0644999999999980', '5.3078696997948249', '0.0000000000000000'], c = ['0,000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +13,5999999999999996].
Как видите, длина a и b равна, а c - самая длинная, но на моем экране она странным образом меняется.
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
from itertools import product, combinations
import sys
from matplotlib.patches import FancyArrowPatch
from mpl_toolkits.mplot3d import proj3d
import math
def transPo(l1,l2):
a = np.array(l1)
#a = a.T
b = np.array(l2)
print(a,b)
result = np.dot(a, b)
return result
def lstFloat(lst):
for i in range(len(lst)):
lst[i] = float(lst[i])
return(lst)
def readData():
with open("INCAR",'r') as f1:
while True:
line = f1.readline()
if not line:break
if ("MAGMOM=" in line) and ("#" not in line) :
mlst=[]
line=line.strip('MAGMOM=')
magon = line.strip().split()
for mag in magon:
if "*" in mag:
mag = mag.split("*")
for n in range(int(mag[0])):
mlst.append(float(mag[1]))
else:
mlst.append(float(mag))
with open("CONTCAR",'r') as f:
f.readline()
f.readline()
lstLabel=[] # x y z label
lstPosition=[]
for i in range(3):
line = f.readline()
lstLabel.append(line.strip().split())
f.readline()
line = f.readline().strip().split()
s = 0
for v in line:
s += int(v)
f.readline()
while True:
line = f.readline()
if line ==" \n":
break
elif not line:
break
else:
lstPosition.append(line.strip().split())
lma=[]
for i in range(s):
val = [0,0,0]
val[0] = mlst[i*3]
val[1] = mlst[i*3 +1]
val[2] = mlst[i*3 + 2]
lma.append(val)
if len(lma)!=len(lstPosition):
print('error!!! Atom number is not equal to the number of magon\n---------------------------')
sys.exit()
print(lstLabel,'\n----lstlabel', lma,'\n---------lma', lstPosition )
return lstLabel, lma, lstPosition
class Arrow3D(FancyArrowPatch):
def __init__(self, xs, ys, zs, *args, **kwargs):
FancyArrowPatch.__init__(self, (0, 0), (0, 0), *args, **kwargs)
self._verts3d = xs, ys, zs
def draw(self, renderer):
xs3d, ys3d, zs3d = self._verts3d
xs, ys, zs = proj3d.proj_transform(xs3d, ys3d, zs3d, renderer.M)
self.set_positions((xs[0], ys[0]), (xs[1], ys[1]))
FancyArrowPatch.draw(self, renderer)
def main():
(lstLabel, lma, lstPosition) = readData()
fig = plt.figure( )
ax = fig.gca(projection='3d')
g = np.array([0,0,0])
print('x',lstFloat(lstLabel[0]))
x = np.array(lstFloat(lstLabel[0]))
y = np.array(lstFloat(lstLabel[1]))
z = np.array(lstFloat(lstLabel[2]))
x_ = y + z
y_ = x + z
z_ = x + y
g_ = x + y + z
ax.plot3D(*zip(x,g), color = "r")
ax.plot3D(*zip(y,g), color = "r")
ax.plot3D(*zip(z,g), color = "y")
ax.plot3D(*zip(x_,g_), color = "b")
ax.plot3D(*zip(y_,g_), color = "b")
ax.plot3D(*zip(z_,g_), color = "b")
ax.plot3D(*zip(x_,y), color = "b")
ax.plot3D(*zip(x_,z), color = "b")
ax.plot3D(*zip(y_,x), color = "b")
ax.plot3D(*zip(y_,z), color = "b")
ax.plot3D(*zip(z_,x), color = "b")
ax.plot3D(*zip(z_,y), color = "b")
ax.yaxis.label.set_size(40)
a = Arrow3D([0, lstLabel[0][0]], [0, lstLabel[0][1]], [0, lstLabel[0][2]], mutation_scale=20,
lw=1, arrowstyle="-|>", color="k")
b = Arrow3D([0, lstLabel[1][0]], [0, lstLabel[1][1]], [0, lstLabel[1][2]], mutation_scale=20,
lw=1, arrowstyle="-|>", color="k")
c = Arrow3D([0, lstLabel[2][0]], [0, lstLabel[2][1]], [0, lstLabel[2][2]], mutation_scale=20,
lw=1, arrowstyle="->", color="k")
ax.scatter([0], [0], [0], color="g", s=100) # yuan dian
ax.add_artist(a)
ax.add_artist(b)
ax.add_artist(c)
for i in range(len(lma)):
#lma, lstPosition
lstFloat(lstPosition[i])
if (abs(lma[i][0] == 0 ) and (abs(lma[i][1]) == 0) and (abs(lma[i][2]) == 0)):
pass
else:
print(np.array(lstPosition[i]),[lstFloat(lstLabel[0]), lstFloat(lstLabel[1]), lstFloat(lstLabel[2])])
lstPosi = transPo([lstFloat(lstLabel[0]), lstFloat(lstLabel[1]), lstFloat(lstLabel[2])],lstPosition[i])
print(lstPosi)
mag = Arrow3D([lstPosi[0] , lstPosi[0] + lma[i][0] ], [lstPosi[1], lstPosi[1] + lma[i][1]],
[lstPosi[2], lstPosi[2] + lma[i][2]], mutation_scale=10,
lw=2, arrowstyle="-|>", color="k")
ax.add_artist(mag)
plt.show()
if __name__ == '__main__':
main()
Я хотел бы видеть правильный куб с такими же масштабами a, b, c.