matplotlib,如何在给定条件下绘制3d 2变量函数

时间:2017-04-15 10:10:44

标签: python numpy matplotlib plot

绘制功能: (x1 - 3)^ 2 +(x2 - 2)^ 2

有约束:

  • x1 ^ 2 - x2 - 3 <= 0
  • x2 - 1 <= 0
  • -x1&lt; = 0

也可以找到等式here

我正在尝试使用matplotlib

以图形方式解决这个问题

graph missing the first condition

但是使用下面的代码(the question i found that helped me with the code)结束了上面的图表,这个代码缺少第一个条件。

import matplotlib.pyplot as plt
from numpy import arange
from pylab import meshgrid

# function to be plotted
def z_func(a, b):
    return (a - 3) * (a - 3) + (b - 2) * (b - 2)

x1 = arange(15.0, 0, -0.1) # x1 >= 0 according to given conditions
x2 = arange(-15.0, 1, 0.1) # x2 <= 1 according to given conditions
X1,X2 = meshgrid(x1, x2)
Z = z_func(X1, X2)

fig = plt.figure()
ax = fig.gca(projection='3d')
surf = ax.plot_surface(X1, X2, Z, rstride=1, cstride=1, cmap=cm.RdBu,linewidth=0, antialiased=False)

ax.zaxis.set_major_locator(LinearLocator(10))
ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f'))

ax.set_xlabel('x-axis')
ax.set_ylabel('y-axis')
ax.set_zlabel('z-axis')
ax.view_init(elev=25, azim=-120)

fig.colorbar(surf, shrink=0.5, aspect=5)
plt.show()         

以何种方式改变上述代码,以便考虑第一个条件?

感谢

1 个答案:

答案 0 :(得分:3)

您可以过滤数组以绘制并将条件外的所有值设置为nan

Z[X1**2 - X2 - 3 > 0] = np.nan

enter image description here

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

# function to be plotted
def z_func(a, b):
    return (a - 3) * (a - 3) + (b - 2) * (b - 2)

x1 = np.arange(15.0, 0, -0.1) # x1 >= 0 according to given conditions
x2 = np.arange(-15.0, 1, 0.1) # x2 <= 1 according to given conditions
X1,X2 = meshgrid(x1, x2)
Z = z_func(X1, X2)
# set all values outside condition to nan
Z[X1**2 - X2 - 3 > 0] = np.nan

fig = plt.figure()
ax = fig.gca(projection='3d')
surf = ax.plot_surface(X1, X2, Z, rstride=1, cstride=1,vmin=0, vmax=np.nanmax(Z), 
                       cmap=plt.cm.RdBu,linewidth=0, antialiased=False)

ax.set_xlabel('x-axis')
ax.set_ylabel('y-axis')
ax.set_zlabel('z-axis')
ax.view_init(elev=25, azim=-120)
ax.set_ylim(0,4)
fig.colorbar(surf, shrink=0.5, aspect=5)
plt.show()