我有一个功能性3d图,但是我想在z = 0时在图上画一条线。
我尝试拆分z> = 0和z <0时的图,但这没有清楚的表示形式,如注释出的代码所示。我想用另一种颜色描绘这条线。另一种解决方案是让图z> = 0的一部分是一种颜色,而z <0是另一种颜色,但是我对此也不断出错。
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter
import numpy as np
def equation(delta=0.05):
#for F=0.5
x = np.arange(0,1,delta)
y = np.arange(2,6,delta)
X,Y = np.meshgrid(x,y)
Z = (X*Y-X-0.5*Y**2+2*0.5*Y)**2-4*(0.5*Y**2-0.5*Y)*(X-X*Y+Y-0.5*Y)
return X, Y, Z
#x = P
#y = K
fig = plt.figure()
ax = Axes3D(fig)
#set labels for graph
ax.set_xlabel('P')
ax.set_ylabel('K')
ax.set_zlabel('Z')
#set colors about and below 0
#c = (Z<=0)
#ax.plot_surface(x,y,z,c=c,cmap='coolwarm')
#ax.plot_surface(x,y,z,c= z<0)
c = z=0
x,y,z = equation(0.01)
surf=ax.plot_surface(x,y,z)
#surf=ax.plot_surface(x,y,z<0)
#surf=ax.plot_surface(x,y,z>=0)
#surf =ax.plot_surface(x,y,z, rstride=5, cstride=5)
#surf = ax.plot_trisurf(x,y,z,cmap=cm.jet,linewidth=0.1,vmin=-15, vmax=100)
#surf = ax.plot_surface(x,y,z,rstride = 5, cstride #=5,cmap=cm.RdBu,linewidth=0, antialiased=False)
ax.zaxis.set_major_locator(LinearLocator(10))
ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f'))
#fig.colorbar(surf, shrink= 0.5, aspect=5)
#ax.view_init(elev=25,azim=-120)
plt.show()
答案 0 :(得分:1)
仅突出显示Z = 0线时,您需要记住,此时不再有曲面,而是2D平面。然后,您想找到2D平面等于零的位置。您想使用Poolka建议的ax.contour(x,y,z,[0])
。我建议更改图表中的透明度(alpha
),以使该线更清晰可见。
您还可以通过创建自定义颜色表并使vmin
和vmax
围绕零为中心,使这2个区域以零2种不同的颜色分开。
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter
import numpy as np
import matplotlib.colors
def equation(delta=0.05):
x = np.arange(0,1,delta)
y = np.arange(2,6,delta)
X,Y = np.meshgrid(x,y)
Z = (X*Y-X-0.5*Y**2+2*0.5*Y)**2-4*(0.5*Y**2-0.5*Y)*(X-X*Y+Y-0.5*Y)
return X, Y, Z
fig = plt.figure()
ax = Axes3D(fig)
#set labels for graph
ax.set_xlabel('P')
ax.set_ylabel('K')
ax.set_zlabel('Z')
#Create custom colormap with only 2 colors
colors = ["blue","red"]
cm1 = LinearSegmentedColormap.from_list('my_list', colors, N=2)
x,y,z = equation(0.01)
surf=ax.plot_surface(x,y,z,alpha=.7,cmap=cm1,vmin=-150,vmax=150) #use custom colormap
#Use a contour plot to isolate Z=0 since it is a line and no longer a surface
ax.contour(x,y,z,[0],colors='k',linewidths=3)
ax.zaxis.set_major_locator(LinearLocator(10))
ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f'))
plt.show()