Python只绘制循环中的最后一条曲线

问题描述 投票:0回答:1

我有一条曲线,我想沿z轴循环旋转N次,每次都想把它绘制到同一个图上。然而,我只得到最后一条曲线被多次重绘。如果相反,我在每次迭代中使用不同的数字,我就会得到预期的结果。错在哪里?这是代码,注释是为了测试在每次迭代中创建新的数字。

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)
python loops matplotlib plot figure
1个回答
-1
投票

需要注意的是,每次都需要创建一个图,否则 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

这不是全部的输出,只是表示多个图谱。

请看 此处 以获得更多的方法。

© www.soinside.com 2019 - 2024. All rights reserved.