使用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()
z[z==np.inf] = np.nan
将其添加到我的代码后,出现以下错误:
TypeError:“numpy.float64”对象不支持项分配
这到底是什么意思?我不明白它的来龙去脉。我想我的情节需要它
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)