我有一个要绘制的PDE的解决方案。我已经在文档中看到了两种方法来执行此操作,其中一种对我有效,而另一种则无效。没有错误产生。一种简单地得出正确的绘图(正弦波),另一种简单地生成斜率为1的线。第二种方法可能在将来有用,即使我现在使用的代码也可以。提前致谢。

工作解决方案:

plt.plot(arange(0, 16*pi, Dt), u[:, index])
plt.show()


这很棒,而且超级简单!在matplotlib文档中也找到了以下方法,但是它产生了不正确的图。我想知道我的错误:

非工作解决方案:

df = pd.DataFrame({'t':arange(0, 16*pi, Dt), 'u':u[:,index]})
plt.plot('t', 'u', data=df)
plt.show()




上下文的完整代码

from math import sin, cos, pi, fabs, log10, ceil, floor
from numpy import arange, zeros
import pandas as pd
from matplotlib import pyplot as plt


#function applies periodic boundary condition where h is the period
def apply_pbc(f, i, Dx, M, h):
    f[i][0] = f[i][int(h/Dx)]
    f[i][int((M + Dx)/Dx)] = f[i][int((M + Dx)/Dx - 1)]

    return f

# function for finding an index associated with
# a particular data point of interest for plotting
# or other analysis
def find_index(start, stop, step, x):
    counter = len(arange(start, stop, step))
    for i in arange(counter):
        x_i = start + i*step
        if abs(x - x_i) < pow(10, -15):
            index = i
            print("x = ", x_i, "@index j = ", i)
            break

    return index

#main body
if __name__ == "__main__":

    #constants
    a = 0.25
    b = 0.25
    c = 1

    #period of boundary conditions
    h = 4*pi

    #space and time endpoints
    M = 4*pi
    N = 16*pi

    #mesh
    Dx = 0.005*4*pi
    Dt = (0.25*Dx)/c

    #simplification of numeric method
    r = (Dt*pow(c,2))/pow(Dx,2)

    #get size of data set
    rows = len(arange(0, N, Dt))
    cols = len(arange(-Dx, M, Dx))

    #initiate solution arrays
    u = zeros((rows, cols))
    v = zeros((rows, cols))

    #apply initial conditions
    for j in range(cols):
        x = -Dx + j*Dx
        u[0][j] = cos(x)
        v[0][j] = 0


    #solve
    for i in range(1, rows):
        for j in range(1, cols - 1):
            u[i][j] = u[i-1][j] + v[i-1][j]*Dt \
                    + (a/2)*(u[i-1][j+1] - 2*u[i-1][j] + u[i-1][j-1])

            v[i][j] = v[i-1][j] \
                    + r*(u[i-1][j+1] - 2*u[i-1][j] + u[i-1][j-1]) \
                    + (b/2)*(v[i-1][j+1] - 2*v[i-1][j] + v[i-1][j-1])
        apply_pbc(u, i, Dx, M, h)
        apply_pbc(v, i, Dx, M, h)

    print("done")

    #we want to plot the solution u(t,x), where x = pi
    index = find_index(-Dx, M + Dx, Dx, pi)

    df = pd.DataFrame({'t':arange(0,16*pi, Dt), 'u':u[:,index]})
    plt.plot('t', 'x', data=df)
    # plt.plot(arange(0, 16*pi, Dt), u[:, index])
    plt.show()

最佳答案

documentation of plt.plot()


  绘制标签数据
  
  有一种方便的方法可以绘制带有标签数据的对象(即
  索引obj ['y']可以访问的数据。而不是给
  x和y中的数据,您可以在data参数中提供对象,
  只需给出x和y的标签:
  
  
    

plot('xlabel', 'ylabel', data=obj)

    
  


我认为您的代码中只有一个错字。在您提供的完整代码中,这是绘制图的线:

plt.plot('t', 'x', data=df)


确实确实给

python - 有关格式化DataFrame以与Matplotlib一起使用的问题-LMLPHP

在更改为

plt.plot('t', 'u', data=df)


按预期工作:
python - 有关格式化DataFrame以与Matplotlib一起使用的问题-LMLPHP

代码的最后一部分:


df = pd.DataFrame({'t':arange(0,16*pi, Dt), 'u':u[:,index]})
plt.plot('t', 'x', data=df)  # <-- 'x' instead of 'u'
# plt.plot(arange(0, 16*pi, Dt), u[:, index])
plt.show()

08-19 22:00