如何使用numpy.meshgrid绘制函数

时间:2019-10-11 09:32:54

标签: python numpy matplotlib

我使用numpy.meshgrid方法在Python中绘制3D图。该图是在变量d1, d2上绘制的,但是我有一个包含7个元素的数组组成的函数,其中3个元素与d1, d2是独立的。当我尝试绘制图形时,会遇到此错误:

operands could not be broadcast together with shapes (7,) (120,120)

调试代码时,我看到独立于d1, d2的数组元素具有1的形状,而其他元素具有120的形状。如何使用numpy.meshgrid方法绘制这样的函数?

谢谢。整个代码如下:

import numpy
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter

def function(a, b, c, d1, d2):
    Q = numpy.ones(7)

    EV = []
    EV.append(1 / (a + b))
    EV.append(1 / (a + b + c))
    EV.append(1 / (a + b + c))
    EV.append((1 - numpy.exp(-c * d1)) / c)
    EV.append((1 - numpy.exp(-c * d2)) / (c + a))
    EV.append((1 - numpy.exp(-c * d1)) / c)
    EV.append((1 - numpy.exp(-c * d2)) / (c + a))

    return numpy.sum(numpy.multiply(Q, EV) / numpy.sum(numpy.multiply(Q, EV)))


fig = plt.figure()
ax = fig.gca(projection='3d')

# Make data.
d1 = numpy.arange(0, 6, 0.05)
d2 = numpy.arange(0, 6, 0.05)
X, Y = numpy.meshgrid(d1, d2)

# Plot the surface.
ax.set_zlim(2.00, 8.00)
surf = ax.plot_surface(X, Y, function(1, 1, 1, X, Y), cmap='viridis', linewidth=0, antialiased=False)

# Customize the z axis.
ax.zaxis.set_major_locator(LinearLocator(10))
ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f'))

# Add a color bar which maps values to colors.
fig.colorbar(surf, shrink=0.5, aspect=5)

plt.show()

1 个答案:

答案 0 :(得分:1)

您可以做类似的事情

Z = np.array([[function(1, 1, 1, x, y) for x in d1] for y in d2])
surf = ax.plot_surface(X, Y, Z, cmap='viridis', linewidth=0, antialiased=False)

但是,该图并不是特别有趣:首先,标识运算乘以1的数组是标识操作,因此np.multiply(Q, EV)与将EV转换为数组相同。对于任何数组anp.sum(a / np.sum(a))等于1(因为您可以将常数np.sum(a)置于外部总和之外)。因此,function始终等于1。