XLPack for Matplotlib Experimental Version 0.1
Example Programs
Loading...
Searching...
No Matches

Plot contour lines of ((x + 100)^2 + (y - 20)^2 + 20*z)/1000 + 1 on x-y, y-z and z-x planes.


Private Function F_Data(X As Double, Y As Double, Z As Double) As Double
    F_Data = ((X + 100) ^ 2 + (Y - 20) ^ 2 + 20 * Z) / 1000 + 1
End Function

Sub Plot_line(Ax3 As Axs3d, X1 As Double, X2 As Double, Y1 As Double, Y2 As Double, Z1 As Double, Z2 As Double)
    Dim X(1) As Double, Y(1) As Double, Z(1) As Double
    X(0) = X1: X(1) = X2: Y(0) = Y1: Y(1) = Y2: Z(0) = Z1: Z(1) = Z2
    Call Ax3.Plot(2, X(), Y(), Z(), "color='0.4', linewidth=1, zorder=1e3")
End Sub

Sub Test_Axs3d_Contour()
    Const Nx = 100, Ny = 300, Nz = 500, Nlev = 10
    Dim X(Nx - 1) As Double, Y(Ny - 1) As Double, Z(Nz - 1) As Double
    Dim Xmax As Double, Xmin As Double, Ymax As Double, Ymin As Double, Zmax As Double, Zmin As Double
    Dim Dmax As Double, Dmin As Double
    Dim Levels(Nlev - 1) As Double
    Dim U() As Double, V() As Double, W() As Double
    Dim I As Long, J As Long, K As Long
    Dim Fig As Figure, Ax3 As Axs3d, C As PyObject
    '-- Make data
    For I = 0 To Nx - 1
        X(I) = I
    Next
    For J = 0 To Ny - 1
        Y(J) = J
    Next
    For K = 0 To Nz - 1
        Z(K) = -K
    Next
    Xmin = 0: Xmax = Nx - 1: Ymin = 0: Ymax = Ny - 1: Zmin = 1 - Nz: Zmax = 0
    Dmin = 1
    Dmax = F_Data(X(Nx - 1), Y(Ny - 1), Z(0))
    Call LineSpace(Dmin, Dmax, Nlev, Levels())
    '-- Plot
    Set Fig = Plt.Figure()
    Set Ax3 = Fig.Add_subplot_3d()
    ' X-Y
    ReDim U(Ny - 1, Nx - 1), V(Ny - 1, Nx - 1), W(Ny - 1, Nx - 1)
    For I = 0 To Ny - 1
        For J = 0 To Nx - 1
            U(I, J) = X(J)
            V(I, J) = Y(I)
            W(I, J) = F_Data(X(J), Y(I), Z(0))
        Next
    Next
    Call Ax3.Contour(Ny, Nx, U(), V(), W(), Levels(), Zdir:="z", Offset:=0)
    For I = 0 To Ny - 1
        For J = 0 To Nx - 1
            W(I, J) = F_Data(X(J), Y(I), Z(Nz - 1))
        Next
    Next
    Call Ax3.Contour(Ny, Nx, U(), V(), W(), Levels(), Zdir:="z", Offset:=Zmin)
    ' Z-X
    ReDim U(Nx - 1, Nz - 1), V(Nx - 1, Nz - 1), W(Nx - 1, Nz - 1)
    For J = 0 To Nx - 1
        For K = 0 To Nz - 1
            U(J, K) = X(J)
            V(J, K) = F_Data(X(J), Y(0), Z(K))
            W(J, K) = Z(K)
        Next
    Next
    Call Ax3.Contour(Nx, Nz, U(), V(), W(), Levels(), Zdir:="y", Offset:=0)
    For J = 0 To Nx - 1
        For K = 0 To Nz - 1
            V(J, K) = F_Data(X(J), Y(Ny - 1), Z(K))
        Next
    Next
    Call Ax3.Contour(Nx, Nz, U(), V(), W(), Levels(), Zdir:="y", Offset:=Ymax)
    ' Y-Z
    ReDim U(Ny - 1, Nz - 1), V(Ny - 1, Nz - 1), W(Ny - 1, Nz - 1)
    For I = 0 To Ny - 1
        For K = 0 To Nz - 1
            U(I, K) = F_Data(X(Nx - 1), Y(I), Z(K))
            V(I, K) = Y(I)
            W(I, K) = Z(K)
        Next
    Next
    Set C = Ax3.Contour(Ny, Nz, U(), V(), W(), Levels(), Zdir:="x", Offset:=Xmax)
    For I = 0 To Ny - 1
        For K = 0 To Nz - 1
            U(I, K) = F_Data(X(0), Y(I), Z(K))
        Next
    Next
    Call Ax3.Contour(Ny, Nz, U(), V(), W(), Levels(), Zdir:="x", Offset:=Xmin)
    ' Axes
    Call Ax3.Set_xlim(Xmin, Xmax)
    Call Ax3.Set_ylim(Ymin, Ymax)
    Call Ax3.Set_zlim(Zmin, Zmax)
    Call Plot_line(Ax3, Xmax, Xmax, Ymin, Ymax, Zmax, Zmax)
    Call Plot_line(Ax3, Xmin, Xmax, Ymin, Ymin, Zmax, Zmax)
    Call Plot_line(Ax3, Xmax, Xmax, Ymin, Ymin, Zmin, Zmax)
    Call Ax3.Set_xlabel("X [km]")
    Call Ax3.Set_ylabel("Y [km]")
    Call Ax3.Set_zlabel("Z [m]")
    ' Plot
    Call Fig.Colorbar(C, Ax:=Ax3, KwArgs:="fraction=0.02, pad=0.1, label='Name [units]'")
    Call Ax3.View_init(40, -30, 0)
    Call Plt.Show
End Sub