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

2024-09-30 03:25:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些问题,尽管我在寻找答案,但还是找不到答案。在

  1. 目前我的代码如下:

     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不被视为数字:

^{pr2}$

将此添加到代码后,我得到以下错误: 类型错误:'数字浮点数64'对象不支持项分配

这到底是什么意思?我不明白这是怎么回事。我想我的阴谋需要它?在

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

    for x in range [-10,10]
    

    以及

    for x in range (-10,10)
    

    是吗?

我知道有几种函数使用

    P[x,y]=....

而不仅仅是

    P=....

是吗?在

我什么时候要用括号?在

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


Tags: infromimportfornprangepltax
1条回答
网友
1楼 · 发布于 2024-09-30 03:25:16

回答您的各种问题:

z[z==np.inf] = np.nan

After adding this to my code, i get the following error: TypeError: 'numpy.float64' object does not support item assignment

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

()[]的混淆很简单,您可以使用list(或任何其他实现__getitem__的容器类)的元素。您使用call对象。在

基本上,这两个部分的语法是不太方便的版本的简短形式

myObject[key]产生myObject.__getitem__(key)myObject(variable)产生{}。只是语法而已。在

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

为了使您的绘图工作,您需要使您的z数组具有正确的形状。在

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

无论如何,通常情况下,您的元素如下所示(对于方形网格):

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

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

^{pr2}$

虽然有可能有一些更快的numpy方法来执行阵列操作,但速度会更快。在

我通常会这样做:

^{3}$

相关问题 更多 >

    热门问题