使用for循环和范围后的3D绘图(Python)

使用for循环和范围后的3D绘图(Python),python,for-loop,matplotlib,range,Python,For Loop,Matplotlib,Range,我有一些问题,虽然我查了一下,但找不到答案 到目前为止,我的代码如下: from mpl_toolkits.mplot3d import Axes3D from matplotlib import cm from math import * from scipy.special import * import matplotlib.pyplot as plt import numpy as np ## Definition der Parameter für Druckglei

我有一些问题,虽然我查了一下,但找不到答案

  • 到目前为止,我的代码如下:

     from mpl_toolkits.mplot3d import Axes3D 
     from matplotlib import cm
     from math import *
     from scipy.special import *
     import matplotlib.pyplot as plt
     import numpy as np
    
     ## Definition der Parameter für Druckgleichung nach Rudnicki (1986) ##
     q = 6.0/1000                                                                       
     lameu = 11.2*10**9                              
     lame = 8.4*10**9                               
     pi                                            
     alpha = 0.65                                    
     G = 8.4*10**9                                   
     k = 1.0e-15                                      
     eta = 0.001                                                 
     t = 1000*365*24600        
    
     kappa = k/eta                                                    
     print "kappa ist:",kappa                                        
     c = ((kappa*(lameu-lame)*(lame+2*G))/((alpha**2)*(lameu+2*G)))  
     print "c ist:",c                                                
    
    
     xmin = -10
     xmax = 10
     ymin = -10
     ymax = 10
     for x in range (xmin,xmax):
     for y in range (ymin,ymax):
            r=sqrt(x**2+y**2)
            P=(q/(rhof*4*pi*kappa))*(expn(1,r**2/(4*c*t)))
            z = P/1e6
            print x,  y,  z
    
    
     x, y = np.meshgrid(x, y)
    
    
     ## Plotting in 3D ##
     fig = plt.figure()
     ax = fig.gca(projection='3d')
     surf = ax.plot_surface(x, y, z, rstride=1, cstride=1, cmap=cm.jet, linewidth=0,
                       antialiased=False, vmin=np.nanmin(z), vmax=np.nanmax(z))
     fig.colorbar(surf, shrink=0.5, aspect=5)
    
     ## Achsenskalen ##
     ax.set_xlim(xmin,xmax)      # x-Achsenskala vorgeben
     ax.set_ylim(ymin,ymax)      # y-Achsenskala vorgeben
    
     ## Beschriftung der Achsen ##
     ax.set_title('Druckverteilung')
     ax.set_xlabel('Distanz zu Well [m]')
     ax.set_ylabel('Distanz zu Well [m]')
     ax.set_zlabel('Druck in [MPa]')
    
     plt.show()  
    
  • 如果我试着运行程序,我的x、y和z的值会按预期显示,但我不会得到任何3D绘图。我以前曾经遇到过这个问题,所以我尝试定义z的无穷大值,将其视为非数字:

        z[z==np.inf] = np.nan
    
    将其添加到我的代码后,出现以下错误: TypeError:“numpy.float64”对象不支持项分配

    这到底是什么意思?我不明白它的来龙去脉。我想我的情节需要它

  • 我的for循环的确切区别是什么,例如使用:

    for x in range [-10,10]
    

    ?

  • 我知道有几种类型的函数使用

        P[x,y]=....
    
    而不仅仅是

        P=....
    
    ?

    我什么时候必须使用括号


    我希望有人能让我轻松起来。谢谢

    要回答您的各种问题:

    将其添加到代码中后,我得到以下错误:TypeError:'numpy.float64'对象不存在 支持项分配

    这是因为
    z
    只是一个数字,而不是数组

    ()
    []
    的混淆很简单,您可以使用
    []
    括号访问
    列表
    (或实现
    \uu getitem\uuuuuuuu
    的任何其他容器类)的元素。您可以使用
    ()
    调用对象

    本质上,这两位语法是不太方便的版本的简短形式

    myObject[key]
    生成
    myObject.\uu获取项目(key)
    ,而
    myObject(变量)
    生成
    myObject.\uu调用(变量)
    。这只是语法

    通常,它们用于创建函数和容器类(您可能会误用它们,但这会导致一些非常混乱的代码)

    至于如何进行绘图,您需要使用正确的形状制作
    z
    数据点阵列

    您遇到的问题是,您没有按要求向提供数据,它需要2D数据数组。
    XX
    YY
    正是
    numpy创建的。meshgrid
    创建的iirc、x和y参数可以是直列,但我没有尝试过

    无论如何,您通常有如下元素(对于方形网格):

    然后,
    ZZ
    就是相应点上函数的
    z
    值,也就是说,如果你正在绘制某个函数,
    f(x,y)
    那么你可以做如下操作:

    for i in range(len(XX)):
      for j in range(len(XX[0])):
        ZZ[i][j] = f(XX[i][j], YY[i][j])
    
    虽然可能有一些更快的numpy方法来执行更快的阵列操作

    我通常会这样做:

    import numpy
    # other boiler plae variable definitions you have
    xs = numpy.linspace(xStart, xStop, num=50)
    ys = numpy.linspace(yStart, yStop, num=50)
    
    XX, YY = numpy.meshgrid(xs,ys)
    ZZ = numpy.zeros_like(XX)
    
    for i, x in enumerate(xs):
      for j, y in enumerate(ys):
        r=sqrt(x**2+y**2)
        P=(q/(rhof*4*pi*kappa))*(expn(1,r**2/(4*c*t)))
        ZZ[i][j] = P/1e6
    
    fig = plt.figure()
    ax = fig.gca(projection='3d')
    surf = ax.plot_surface(XX, YY, ZZ, rstride=1, cstride=1, cmap=cm.jet, linewidth=0,
                           antialiased=False, vmin=np.nanmin(ZZ), vmax=np.nanmax(ZZ))
    fig.colorbar(surf, shrink=0.5, aspect=5)
    

    到目前为止,谢谢!我仍然很难理解你对上一个绘图问题的解释。你能试着用另一种方式来解释它吗?我对python的兴趣只是为了我的论文,所以我对语法只有非常基本的知识。有没有其他方法来编码或解释这个问题?我必须使用numpy吗?最后一个问题是for
    []
    ()
    ?或者关于实际绘图工作?我指的是你使用numpy和np.zero的方式,通常是你最后的编码示例:)
    XX
    1 2 3 4 5 6 7 8 9
    1 2 3 4 5 6 7 8 9
    1 2 3 4 5 6 7 8 9
    1 2 3 4 5 6 7 8 9
    1 2 3 4 5 6 7 8 9
    1 2 3 4 5 6 7 8 9
    1 2 3 4 5 6 7 8 9
    1 2 3 4 5 6 7 8 9
    
    YY
    1 1 1 1 1 1 1 1 1
    2 2 2 2 2 2 2 2 2 
    3 3 3 3 3 3 3 3 3
    4 4 4 4 4 4 4 4 4
    5 5 5 5 5 5 5 5 5 
    6 6 6 6 6 6 6 6 6
    7 7 7 7 7 7 7 7 7
    8 8 8 8 8 8 8 8 8
    9 9 9 9 9 9 9 9 9
    
    for i in range(len(XX)):
      for j in range(len(XX[0])):
        ZZ[i][j] = f(XX[i][j], YY[i][j])
    
    import numpy
    # other boiler plae variable definitions you have
    xs = numpy.linspace(xStart, xStop, num=50)
    ys = numpy.linspace(yStart, yStop, num=50)
    
    XX, YY = numpy.meshgrid(xs,ys)
    ZZ = numpy.zeros_like(XX)
    
    for i, x in enumerate(xs):
      for j, y in enumerate(ys):
        r=sqrt(x**2+y**2)
        P=(q/(rhof*4*pi*kappa))*(expn(1,r**2/(4*c*t)))
        ZZ[i][j] = P/1e6
    
    fig = plt.figure()
    ax = fig.gca(projection='3d')
    surf = ax.plot_surface(XX, YY, ZZ, rstride=1, cstride=1, cmap=cm.jet, linewidth=0,
                           antialiased=False, vmin=np.nanmin(ZZ), vmax=np.nanmax(ZZ))
    fig.colorbar(surf, shrink=0.5, aspect=5)