Проследить трехмерный график с черной линией, где Z = 0? - PullRequest
2 голосов
/ 08 июля 2019

У меня есть функциональный 3d-график, но я хочу сделать линию графика на графике, когда z = 0.

Я пытался разделить графики для случаев, когда z> = 0 и z <0, но это не дает четкого представления, как показано в закомментированном коде. Я хочу проследить эту линию другим цветом. Другое решение состояло бы в том, чтобы часть графика z> = 0 была одного цвета, а z <0 - другого цвета, но я также получаю ошибку для этого. </p>

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

1 Ответ

2 голосов
/ 17 июля 2019

Когда вы просто выделяете линию Z = 0, вы должны помнить, что в этот момент у вас больше нет поверхности, но есть 2D-плоскость.Затем вы хотите найти, где эта 2D плоскость равна нулю.Вы хотите использовать предложенное Poolka значение ax.contour(x,y,z,[0]).Я бы предложил изменить прозрачность (alpha) на графиках, чтобы сделать эту линию более видимой.

Вы также можете разделить эти 2 области по нулю на 2 разных цвета, создав собственную цветовую карту и сделав вашу vmin и vmax с центром вокруг нуля.

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

enter image description here

...