matplotlib 如何3D绘制2个变量的函数

iyfamqjs  于 2023-05-01  发布在  其他
关注(0)|答案(3)|浏览(134)

我试图三维绘图放大系数的振动多种类型的阻尼。为了简化那些不知道它是什么的人,基本上,你有3个变量:

  • β,它在0和无穷大之间变化,但我想把它从0到3,在0。2个间隔。
  • 阻尼比,d,它在0和无穷大之间变化,但我想把它从0画到1。1间隔。
  • 最后是nu,它是一个根据前面两个变量而变化的函数。

我的直觉告诉我应该用(X,Y,Z)=(beta,d,nu)来绘制这个图,但是我刚刚开始使用这个库,我对python有点陌生,我只是在需要可视化或计算课堂上的问题时使用它。我尝试为beta和d创建2个数组,但我不知道是否应该为nu创建数组,因为它依赖于两者。
这是我到目前为止的代码:

import math
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

nu = []
b = [0.1 + i / 100 for i in range(0, 510)]
damp = [0.1 + i/10 for i in range(0,510)]

for d in damp:
    nu_new = []
    nu.append(nu_new)
    for beta in b:
        nu_new.append( math.sqrt(1+(2*d*beta)**2)/ math.sqrt((1-beta**2)**2+(2*d*beta)**2))

fig = plt.figure()
ax = Axes3D(fig)
ax.plot(b, d, nu)
plt.show()

我有点坚持试图策划这一点,所以如果你有任何建议,我会很高兴。

uqdfh47h

uqdfh47h1#

如果你使用的是numpy,那么不要使用math模块。Numpy和所有内置的数学函数一样,但它们在numpy数组上的工作要好得多。我们可以在网格的帮助下计算所有B,d值的nu。
meshgrid可以获取2个1D数组,并返回2个2D数组,使得数组中的每个索引对应于原始1D数组中的唯一元素对。

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np

b = np.arange(0.2, 3.2, 0.2)
d = np.arange(0.1, 1.0, 0.1)

B, D = np.meshgrid(b, d)
nu = np.sqrt( 1 + (2*D*B)**2 ) / np.sqrt( (1-B**2)**2 + (2*D*B)**2)

fig = plt.figure()
ax = Axes3D(fig)
ax.plot_surface(B, D, nu)
plt.xlabel('b')
plt.ylabel('d')
plt.show()

这产生:

此外,3D图往往会阻止看到所有数据(因为尖峰隐藏了它后面的东西)。我建议使用pcolormesh或contourf plot。在后一种情况下,最后6行变为:

plt.contourf(B, D, nu)
plt.colorbar()
plt.xlabel('b')
plt.ylabel('d')
plt.show()

其产生:

qni6mghb

qni6mghb2#

这应该可以工作:我不是PythonMaven,特别是两个for循环可能非常不符合Python,但它完成了工作。

import math
import matplotlib.pyplot as plt
import numpy as np

b = np.arange(0.2, 3.2, 0.2)
d = np.arange(0.1, 1.0, 0.1)
nu = np.zeros( (b.size, d.size) )
counter_y = 0

for deta in d:
    counter_x = 0
    for beta in b:
        nu[counter_x, counter_y] = math.sqrt( 1 + (2*deta*beta)**2 ) / math.sqrt( (1-beta**2)**2 + (2*deta*beta)**2)
        counter_x += 1
    counter_y += 1

X, Y = np.meshgrid(d, b)

fig = plt.figure()
ax = fig.add_subplot(111, projection = '3d')
ax.plot_surface(X, Y, nu)
bq3bfh9z

bq3bfh9z3#

你需要先创建一个matplotlib figure

fig = plt.figure()
ax = Axes3D(fig)
ax.plot(b, d, nu)
plt.show()

此外,所有变量的大小应该相同。因此,变量d应该是一个与其他变量相同长度的数组。
如果你把你的变量d变成0.1的数组,长度510,你会得到如下结果。

import math
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

nu = []
b = [0.1 + i / 100 for i in range(0, 510)]
d = 0.1

for beta in b:
    nu.append( math.sqrt(1+(2*d*beta)**2)/ math.sqrt((1-beta**2)**2+(2*d*beta)**2))

#turned d into array of length 510 with 0.1 for each value
d = np.ones(510)*0.1

fig = plt.figure()
ax = Axes3D(fig)
ax.plot(b, d, nu)
plt.show()

你会得到:

相关问题