我必須繪製一個具有無意義負值的3d函數(它們不應出現在圖中)。它必須是情節的功能是這樣的:Matplotlib忽略三維圖中的負值
def constraint_function(x, y):
return min(
(1800 - 0.3 * x - 0.5 * y)/0.4,
(500 - 0.1 * x - 0.08 * y)/0.12,
(200 - 0.06 * x - 0.04 * y)/0.05
)
我計算功能的方式如下:
xs = np.linspace(0, 3600, 1000)
ys = np.linspace(0, 3600, 1000)
zs = np.empty(shape=(1000, 1000))
for ix, x in enumerate(xs):
for iy, y in enumerate(ys):
zs[ix][iy] = constraint_function(x, y)
xs, ys = np.meshgrid(xs, ys)
功能大多在廣場[0, 3600]x[0, 3600]
有效值。第一種方法我已經被設定軸界限適合我的需要:
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.azim = 20
ax.set_xlim(0, 3500)
ax.set_ylim(0, 3500)
ax.set_zlim(0, 4500)
ax.plot_surface(xs, ys, zs)
plt.show()
導致以下情節:
它只是忽略的限制,做反正繪製。第二種方法是定義負值爲np.nan
改變功能是爲:
def constraint_function(x, y):
temp = min(
(1800 - 0.3 * x - 0.5 * y)/0.4,
(500 - 0.1 * x - 0.08 * y)/0.12,
(200 - 0.06 * x - 0.04 * y)/0.05
)
return temp if temp >= 0 else np.nan
和設置無效值的阿爾法爲零:
plt.cm.jet.set_bad(alpha=0.0)
ax.azim = 20
ax.set_xlim(0, 3500)
ax.set_ylim(0, 3500)
ax.set_zlim(0, 4500)
ax.plot_surface(xs, ys, zs)
plt.show()
它給我留下了鋸狀這也是我不想擁有的邊界。當情節轉爲負面時,是否有辦法擺脫這些邊緣並獲得平滑線條?