Python только строит последнюю кривую в цикле - PullRequest
2 голосов
/ 02 мая 2020

У меня есть кривая, которую я хочу повернуть вдоль оси z N раз в al oop, и каждый раз, когда я хочу построить ее на одной фигуре. Однако я получаю только последнюю кривую, перерисованную несколько раз. Если вместо этого я использую разные цифры в каждой итерации, я получаю ожидаемый результат. Где ошибка? Это код, комментарии для тестирования создания новых фигур в каждой итерации:

o = 2*pi/N
for m in range(N):
    #fig = plt.figure()
    #ax = fig.add_subplot(111, projection='3d')
    #ax.view_init(45,)
    #fig.set_size_inches(10,10)
    for n in range(len(x1)):
        x1[n],y1[n] = cos(o)*x1[n] - sin(o)*y1[n], sin(o)*x1[n] + cos(o)*y1[n]
    ax.plot(x1,y1,z1,'k')
    #plt.show()

Это то, чего я хочу более или менее, чего я достиг, используя другой метод:

enter image description here

но вместо этого я получаю:

enter image description here

Вот как я вычисляю x1, y1, z1, если кто-то хочет проверить это

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from numpy import array, linspace
from math import pi, cos, sin, atan2, sqrt

def pltcono(xo,yo,a):
    N = 100
    x1 = []
    y1 = []
    z1 = []
    for t in linspace(0,1,N):
        x = (xo[1]-xo[0])*t + xo[0]
        y = (yo[1]-yo[0])*t + yo[0]
        r = sqrt(x**2 + y**2)
        if (r > 1.0000000001):
            return x1,y1,z1
        o = atan2(y,x)
        x1 += [a*r/(2*pi)*cos(2*pi*o/a)]
        y1 += [a*r/(2*pi)*sin(2*pi*o/a)]
        z1 += [-r*sqrt(1-(a/(2*pi))**2)]
    return x1,y1,z1

def cono(a):
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')
    ax.view_init(45,)
    fig.set_size_inches(10,10)

    o = a/2
    r = 1
    N = 10
    p = a/10

    x = [r*cos(p)]
    y = [r*sin(p)]

    x += [r*sin(o-p)/sin(o)]
    y += [0]
    x1,y1,z1 = pltcono(x,y,a)

    while (o + a < pi):
        o+= a
        x[0] = x[1]*cos(a)
        y[0] = x[1]*sin(a)

        x[1] = r*sin(a/2-p)/sin(o)
        xt,yt,zt = pltcono(x,y,a)
        x1 += xt
        y1 += yt
        z1 += zt

    x[0] = x[1]*cos(a)
    y[0] = x[1]*sin(a)

    x[1] = x[0] - cos(o+a)
    y[1] = y[0] - sin(o+a)
    xt,yt,zt = pltcono(x,y,a)
    x1 += xt
    y1 += yt
    z1 += zt

    x1 = array(x1)
    y1 = array(y1)
    z1 = array(z1)

    o = 2*pi/N
    for m in range(N):
        #fig = plt.figure()
        #ax = fig.add_subplot(111, projection='3d')
        #ax.view_init(45,)
        #fig.set_size_inches(10,10)
        for n in range(len(x1)):
            x1[n],y1[n] = cos(o)*x1[n] - sin(o)*y1[n], sin(o)*x1[n] + cos(o)*y1[n]
        ax.plot(x1,y1,z1,'k')
        #plt.show()


cono(pi/6+pi/24+0.001)

1 Ответ

0 голосов
/ 02 мая 2020

Обратите внимание, что вам нужно создавать фигуру каждый раз, или pyplot будет отображаться в первом созданном.

import math
import matplotlib.pyplot as plt

o = 2*pi/N
for m in range(N):
    for n in range(len(x1)):
        x1[n],y1[n] = math.cos(o)*x1[n] - math.sin(o)*y1[n], math.sin(o)*x1[n] + math.cos(o)*y1[n]
        plt.figure()
        plt.plot(x1,y1,z1,'k')

Я присвоил случайные значения x1, y1, z1 , N и получил следующий вывод: It is not the whole output, just signifies multiple plots

Это не весь вывод, просто означает несколько графиков.

Смотрите здесь для большего количества способов сделать то же самое.

...