Python Matplotlib忽略三维打印中的负值

Python Matplotlib忽略三维打印中的负值,python,python-3.x,matplotlib,Python,Python 3.x,Matplotlib,我必须绘制一个具有无意义负值的3d函数(它们不应该出现在绘图中)。必须绘制的函数如下所示: 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.li

我必须绘制一个具有无意义负值的3d函数(它们不应该出现在绘图中)。必须绘制的函数如下所示:

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)
该函数的有效值主要在正方形
[03600]x[03600]
中。我的第一个方法是设置轴限制以满足我的需要:

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
并将无效值的alpha设置为零:

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()

它给我留下了锯齿状的边界,这也是我不想要的。当绘图变为负数时,是否有办法去除这些边并获得平滑的线条?

首先,z值数组轴反转;它应该是
zs[iy][ix]
而不是
zs[ix][iy]
。因此,您的绘图从左向右翻转

第二,用Python迭代构建z数组要慢得多;您应该改为委托给numpy,如下所示:

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

# create axis sample
xs = np.linspace(0, 3600, 1000)
ys = np.linspace(0, 3600, 1000)

# create mesh samples
xxs, yys = np.meshgrid(xs, ys)

# create data
zzs = np.min([
    ((1800 - 0.30 * xxs - 0.50 * yys) / 0.40),
    (( 500 - 0.10 * xxs - 0.08 * yys) / 0.12),
    (( 200 - 0.06 * xxs - 0.04 * yys) / 0.05)
], axis=0)

# clip data which is below 0.0
zzs[zzs < 0.] = np.NaN
产生


从技术上讲,您可以倾斜网格,使网格的点(这将导致zick-zack图案)移动,使其位于一条线上

如下所示

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

x=np.linspace(-5,5,6)
X,Y = np.meshgrid(x,x)
Z = X+Y

X[Z==-2] = X[Z==-2]+1
Y[Z==-2] = Y[Z==-2]+1
Z[Z==-2] = 0
Z[Z<0] = np.nan

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

ax.set_zlim(0, 12)
ax.plot_surface(X, Y, Z)

plt.show()
将numpy导入为np
将matplotlib.pyplot作为plt导入
从mpl_toolkits.mplot3d导入Axes3D
x=np.linspace(-5,5,6)
十、 Y=np.meshgrid(X,X)
Z=X+Y
X[Z==-2]=X[Z==-2]+1
Y[Z==-2]=Y[Z==-2]+1
Z[Z==-2]=0
Z[Z
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

x=np.linspace(-5,5,6)
X,Y = np.meshgrid(x,x)
Z = X+Y

X[Z==-2] = X[Z==-2]+1
Y[Z==-2] = Y[Z==-2]+1
Z[Z==-2] = 0
Z[Z<0] = np.nan

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

ax.set_zlim(0, 12)
ax.plot_surface(X, Y, Z)

plt.show()