Я строю несколько строк на одном графике, используя matplotlib в Python, используя цикл for для добавления каждой строки на ось.
При построении в 2D с каждой линией поверх другой это работает нормально.
Однако при построении графика в 3D python отображает одни и те же графические данные каждый раз, когда я запускаю цикл for, даже если данные значительно различаются.
Изменить: я не считаю, что этот вопрос является дубликатом "Как узнать, создает ли NumPy представление или копию?", поскольку он выделяет один конкретный случай неожиданного поведения.
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d
###### Unimportant maths not relevant to the question ######
def rossler(x_n, y_n, z_n, h, a, b, c):
#defining the rossler function
x_n1=x_n+h*(-y_n-z_n)
y_n1=y_n+h*(x_n+a*y_n)
z_n1=z_n+h*(b+z_n*(x_n-c))
return x_n1,y_n1,z_n1
#defining a, b, and c
a = 1.0/5.0
b = 1.0/5.0
c = 5
#defining time limits and steps
t_0 = 0
t_f = 50*np.pi
h = 0.01
steps = int((t_f-t_0)/h)
#create plotting values
t = np.linspace(t_0,t_f,steps)
x = np.zeros(steps)
y = np.zeros(steps)
z = np.zeros(steps)
##### Relevant to the question again #####
init_condition_array = [[0,0,0],[0.1,0,0],[0.2,0,0],[0.3,0,0]]
color_array = ["red","orange","green","blue"]
color_counter = 0
zs_array = [0, 0.1, 0.2, 0.3]
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
for row in init_condition_array:
x[0] = row[0]
y[0] = row[1]
z[0] = row[2]
for i in range(x.size-1):
#re-evaluate the values of the x-arrays depending on the initial conditions
[x[i+1],y[i+1],z[i+1]]=rossler(x[i],y[i],z[i],t[i+1]-t[i],a,b,c)
plt.plot(t,x,zs=zs_array[color_counter],zdir="z",color=color_array[color_counter])
color_counter += 1
ax.set_xlabel('t')
ax.set_ylabel('x(t)')
plt.show()
Как видите, графики должны выглядеть совершенно иначе;
это 2D-изображение графиков на той же оси с некоторыми изменениями в коде (показано ниже):
Хотя это график, созданный 3D-графиком:
.
Двухмерный график был создан путем внесения этих небольших изменений в код; ничего выше первой строки не изменилось:
init_condition_array = [[0,0,0],[0.1,0,0],[0.2,0,0],[0.3,0,0]]
color_array = ["red","orange","green","blue"]
color_counter = 0
fig = plt.figure()
ax = fig.add_subplot(111)
for row in init_condition_array:
x[0] = row[0]
y[0] = row[1]
z[0] = row[2]
for i in range(x.size-1):
#re-evaluate the values of the x-arrays depending on the initial conditions
[x[i+1],y[i+1],z[i+1]]=rossler(x[i],y[i],z[i],t[i+1]-t[i],a,b,c)
plt.plot(t,x,color=color_array[color_counter],lw=1)
color_counter += 1
ax.set_xlabel('t')
ax.set_ylabel('x(t)')
plt.show()
x = np.zeros(steps)
внутри циклаfor row in init_condition_array
устраняет/предотвращает проблему. Похоже (каким-то образом)x
хранится внутри объектовLine3D
, возвращаемыхplt.plot
, но изменениеx
влияет на значения, хранящиеся в другихLine3D
... - person unutbu   schedule 01.04.2016