如何在python中2D变量的3D绘图功能?

时间:2018-08-09 10:58:51

标签: python matplotlib 3d data-visualization

我正在尝试对多种阻尼类型的振动进行3D放大图绘制。为了让那些不知道它是什么的人简化它,基本上,您有3个变量:

  • beta,它在0到无穷大之间变化,但我想以0.2的间隔将其从0可视化为3。
  • 阻尼比d在0到无穷大之间变化,但我想以0.1的间隔将其从0绘制到1。
  • 最后,nu是一个函数,它根据之前的两个变量而变化。

2D function, y is nu, x is beta

我的直觉说我应该用(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()

我有点想绘制这个图,所以如果您有任何建议,我会很高兴的。

3 个答案:

答案 0 :(得分:0)

您需要首先创建一个matplotlib figure

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

此外,所有变量的大小均应相同。因此,变量d的长度应与其他变量相同。

如果将变量d转换为长度为0.1的{​​{1}}数组,您将得到关注。

510

您得到:

enter image description here

答案 1 :(得分:0)

这应该起作用: 我不是Python专家,尤其是两个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)

答案 2 :(得分:0)

如果您使用的是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()

这将产生: enter image description here

此外,3D绘图往往会阻止查看所有数据(因为尖峰将数据隐藏在其后面)。我建议使用pcolormesh或Contourf图。在后一种情况下,最后6行变为:

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

产生: enter image description here