Tengo un código en el que para 3 valores diferentes de D, tengo 3 valores diferentes de dx y, por lo tanto, 3 gráficos diferentes.

Quiero hacer una parcela que tenga las 3 parcelas en una.

...
D=(0.133e-4,0.243e-4,0.283e-4)

dx=sc.zeros(3)
    for i in D:
        dx[i]=sc.sqrt(D[i]*dt/M)

        plt.ion()
        while n<N:
            Vw_n=Vw_n1
            C_n=C_n1
            R2=(Vw_n+B1)/(Vw_0+B1)
            Cc=C_n1[0]/C0
            F2_1=10000/3*Pw*A*(C0*Vw_0/Vw_n1-C_n[1])
            dV=F2_1*dt
            Vw_n1=Vw_n+dV
            C_n1[0]=C0*Vw_0/Vw_n1
            F_i_2=-D[i]/dx[i]*(C_n[1:7]-C_n[0:6])
            C_n1[0:6]=C_n[0:6]-F_i_2*A*dt/(L/(V0/A)*V0/5)
            n+=1
            ttime=n*0.02*1000

            #-----PLOT AREA---------------------------------#

            mylabels=('T=273','T=293','T=298')
            colors=('-b','or','+k')

            if x==1:
                plt.plot(ttime,R2,mylabels[i],colors[i])
            elif x==2:
                plt.plot(ttime,Cc,mylabels[i],colors[i])
            plt.draw()
            plt.show()

---------- RUNNABLE --------------------------

import scipy as sc
import matplotlib.pyplot as plt


def graph(x):

    A=1.67e-6  
    V0=88e-12 
    Vw_n1=71.7/100*V0 
    Pw=0.22   
    L=4e-4
    B1=V0-Vw_n1   

    C7=0.447e-3  



    dt=0.2e-4
    M=0.759e-1

    C_n1=sc.zeros(7)
    C_n1[0:6]=0.290e-3
    C_n1[6]=0.447e-3


    C0=C_n1[0]
    Vw_0=Vw_n1

    N=2000 
    n =1
    D = ,0.243e-4
    dx = sc.sqrt(D*dt/M)

        plt.ion()
        while n<N:
            Vw_n=Vw_n1
            C_n=C_n1
            R2=(Vw_n+B1)/(Vw_0+B1)
            Cc=C_n1[0]/C0
            F2_1=10000/3*Pw*A*(C0*Vw_0/Vw_n1-C_n[1])
            dV=F2_1*dt
            Vw_n1=Vw_n+dV
            C_n1[0]=C0*Vw_0/Vw_n1
            F_i_2=-D/dx*(C_n[1:7]-C_n[0:6])
            C_n1[0:6]=C_n[0:6]-F_i_2*A*dt/(L/(V0/A)*V0/5)
            n+=1
            ttime=n*0.02*1000

            #-----PLOT AREA---------------------------------#


            if x==1:
                plt.plot(ttime,R2)
            elif x==2:
                plt.plot(ttime,Cc)
            plt.draw()
            plt.show()

Mi problema es que quiero trazar (ttime, R2) y (ttime, Cc). Pero no puedo entender cómo llamar a R2 y Cc para los 3 valores diferentes de D (y dx).

Además, estoy recibiendo un error: los índices de tupla deben ser enteros, no flotantes

En dx [i] = sc.sqrt (D [i] * dt / M).

¡Gracias!

1
George 31 ene. 2012 a las 21:07

1 respuesta

La mejor respuesta

Considere estas líneas:

D=(0.133e-4,0.243e-4,0.283e-4)
for i in D:
    dx[i]=sc.sqrt(D[i]*dt/M)

i es un flotador. No se puede utilizar como índice en la tupla D. (D[i] no tiene sentido).

Quizás quisiste decir

D=(0.133e-4,0.243e-4,0.283e-4)
for i, dval in enumerate(D):
    dx[i] = sc.sqrt(dval*dt/M)

O simplemente

import scipy as sc
D = sc.array([0.133e-4,0.243e-4,0.283e-4])
dx = sc.sqrt(D*dt/M)

  • No llames a plt.plot una vez por cada punto. Ese camino conduce a comportamiento lento. En su lugar, acumule el valor de una curva completa de puntos de datos, y luego llame a plt.plot una vez para toda la curva.
  • Para trazar 3 curvas en la misma figura, simplemente llame a plt.plot 3 veces. Haz eso primero antes de llamar a plt.show().
  • El ciclo while not flag no terminaba cuando ingresa 1 para x, porque if x==2 debería haber sido elif x==2.
  • Para animar una gráfica de matplotlib, aún debe intentar evitar múltiples llamadas a plt.plot. En su lugar, use plt.plot una vez para hacer un Line2D objeto y, a continuación, actualice los datos subyacentes con llamadas a line.set_xdata y line.set_ydata. Consulte el ejemplo de Joe Kington y este ejemplo del documentos de matplotlib.

import scipy as sc
import matplotlib.pyplot as plt

def graph(x):
    plt.ion()
    fig = plt.figure()
    ax = fig.add_subplot(1, 1, 1)
    lines = []
    D = (0.133e-4, 0.243e-4, 0.283e-4)
    temperatures = ('T = 273','T = 293','T = 298')
    N = 2000
    linestyles = ('ob', '-r', '+m')
    for dval, linestyle, temp in zip(D, linestyles, temperatures):
        line, = ax.plot([], [], linestyle, label = temp) 
        lines.append(line)
    plt.xlim((0, N*0.02*1000))        
    if x == 1:
        plt.ylim((0.7, 1.0))
    else:
        plt.ylim((1.0, 1.6))
    plt.legend(loc = 'best')        
    for dval, line in zip(D, lines):
        A = 1.67e-6
        V0 = 88e-12
        Vw_n1 = 71.7/100*V0
        Pw = 0.22
        L = 4e-4
        B1 = V0-Vw_n1
        C7 = 0.447e-3
        dt = 0.2e-4
        M = 0.759e-1
        C_n1 = sc.zeros(7)
        C_n1[0:6] = 0.290e-3
        C_n1[6] = 0.447e-3
        C0 = C_n1[0]
        Vw_0 = Vw_n1

        tvals = []
        yvals = []
        dx = sc.sqrt(dval*dt/M)
        for n in range(1, N+1, 1):
            Vw_n = Vw_n1
            C_n = C_n1
            R2 = (Vw_n+B1)/(Vw_0+B1)
            Cc = C_n1[0]/C0
            F2_1 = 10000/3*Pw*A*(C0*Vw_0/Vw_n1-C_n[1])
            dV = F2_1*dt
            Vw_n1 = Vw_n+dV
            C_n1[0] = C0*Vw_0/Vw_n1
            F_i_2 = -dval/dx*(C_n[1:7]-C_n[0:6])
            C_n1[0:6] = C_n[0:6]-F_i_2*A*dt/(L/(V0/A)*V0/5)
            tvals.append(n*0.02*1000)
            yvals.append(R2 if x == 1 else Cc)
            if not len(yvals) % 50:
                line.set_xdata(tvals)
                line.set_ydata(yvals)
                fig.canvas.draw()

if __name__ == "__main__":
    flag = False
    while not flag:
        try:
            x = int(raw_input("Give a choice 1  or 2  : "))
            flag = True
            if x == 1:
                plt.title('Change in cell volume ratio as a function of time \n\
                at various temperatures')
                plt.xlabel('Time')
                plt.ylabel('Ceil volume ratio (V/V0)')
                graph(x)
            elif x == 2:
                plt.title('Increase of solute concentration at various temperatures')
                plt.xlabel('Time')
                plt.ylabel('Solute concentration in the Ceil (Cc)')
                graph(x)
            else:
                flag = False
                print("You must input 1 or 2")
        except ValueError:
            print("You must input 1 or 2")
    raw_input('Press a key when done')
2
Community 23 may. 2017 a las 14:48
: (actualicé) Utilizo matrices scipy. Ahora (¿por qué extraño?) cuando ingreso "1", el programa solo muestra el mensaje "Debes ingresar 1 o 2" y no se ejecuta. Además, no respondiste a mi otra pregunta sobre cómo hacer que este "plt.plot (ttime, R2, mylabels [i], colors [i])" funcione para los 3 valores diferentes. No sé cómo manipular R2. ¡Gracias!
 – 
George
31 ene. 2012 a las 21:26
1
¿Puede proporcionar un ejemplo breve, simplificado y ejecutable? No tengo idea de lo que significan esas muchas variables ni de lo que va mal.
 – 
unutbu
31 ene. 2012 a las 22:20
: Ok, te di un código ejecutable. Funciona para un valor de DI quiero hacerlo capaz de ejecutarse para los 3 valores. (También, traza en una parcela las 3 parcelas diferentes para los 3 valores) .Si ves mi código anterior, comprenderá lo que estoy tratando de hacer.¡Gracias!
 – 
George
1 feb. 2012 a las 00:38
: En primer lugar, ¡muchas gracias! ¡Casi perfecto! Una cosa. Llamar a la trama como "plt.plot (tvals, yvals, '-')" da como resultado la mezcla de las tramas. Probé algo como: colors = ('ob' , '- r', '+ m'), pero no sé cómo ponerlo en la llamada anterior de la trama. ¿Hay alguna manera?
 – 
George
1 feb. 2012 a las 01:12
Para cumplir con la terminología de matplotlib, estoy cambiando el nombre de colors -> linestyles. Puede recorrer los valores de D y linestyles con for dval, linestyle in zip(D,linestyles). El código anterior se ha editado para mostrar lo que quiero decir.
 – 
unutbu
1 feb. 2012 a las 01:19