Как я могу нарисовать координатные оси в определенном месте? - PullRequest
0 голосов
/ 12 мая 2018

Я попытался найти способ отображения координатных осей трехмерного пространства в другом месте, отличном от того, которое по умолчанию выполняет matplotlib.

Чтобы показать нужную ситуацию, я привел две цифры, на которых яНарисуйте восемь углов куба.

Рисунок 1: matplotlib-default для координатных осей рисования

Рисунок 1 - представление по умолчанию координатных осейMatplotlib.Оси координат нарисованы "на концах пробелов.

Рисунок 2: желаемое место при рисовании координатных осей

Представление на рисунке 2 показывает координатуОси, происходящие из одной общей точки. Это желаемое представление.

Теперь вопрос: «Как мне достичь желаемой ситуации?»

Я оглянулсяи не смог найти ответ на этот вопрос. Я думаю, что это может быть простой параметр, который не так легко найти, поэтому я также предоставил код, который генерирует «представление по умолчанию matplotlib» (см. ниже).

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


def plot_3Dcube():
    """Plots a 3D cube in a 3D-window
    """
    #--------------------------------------
    # PROCESS ARGUMENTS AND LOCAL VARIABLES
    #--------------------------------------
    mycube = cube()       # The cube to be plotted

    #---------------
    # Setup the plot
    #---------------
    fig = plt.figure()
    ax  = fig.add_subplot(111,projection="3d")

    #---------------------------------------------
    # Format the point-data and add it to the plot
    #---------------------------------------------
    colour = (1.0, 0, 0, 1)     # RGB, alpha
    mrkr   = '^'
    s      = 50
    print (mycube)
    ax.scatter(mycube[:,0],mycube[:,1],mycube[:,2],
                c      = colour,
                marker = mrkr
                )
    ptnr=0
    for row in mycube:
        ptnr += 1
        ax.text(row[0],row[1],row[2],str(ptnr),
                size   = 8,
                color  = (0,0,0)
                )

    #----------------
    # Format the plot
    #----------------
    ax.set_xlabel('X as')
    ax.set_ylabel('Y as')
    ax.set_zlabel('Z as')

    #--------------
    # SHOW THE PLOT
    #--------------
    ax.view_init(15,30)
    plt.show()

    #=-=-=-=-=-=-=-=-=-=-=-
    # RETURN FROM FUNCTION
    #=-=-=-=-=-=-=-=-=-=-=-
    return None
#</plot_3dCube()>


def cube():
    """Returns the eight points of a cube in a numpy-array.
    """
    c = np.array([[5.0, 0.0, 5.0],  # Ptnr 1, Front UpperLeft
                  [5.0, 5.0, 5.0],  # Ptnr 2, Front Upper Right
                  [5.0, 5.0, 0.0],  # Ptnr 3, Front Lower Right
                  [5.0, 0.0, 0.0],  # Ptnr 4, Front Lower Left

                  [0.0, 0.0, 5.0],  # Ptnr 5, Back, Upper Right
                  [0.0, 5.0, 5.0],  # Ptnr 6, Back, Upper Left
                  [0.0, 5.0, 0.0],  # Ptnr 7, Back, Lower Left
                  [0.0, 0.0, 0.0],  # Ptnr 8, Back, Lower Right
                 ])
    return c
#</cube()>


#==================================================================
#   TEST area    
#==================================================================

def main():
    print ("Entering Main()\n")
    plot_3Dcube()
#</main()>

if __name__ == "__main__":
    main()

Заранее спасибо за помощь.

1 Ответ

0 голосов
/ 12 мая 2018

Кажется, по крайней мере, есть пара возможных дубликатов, но мне не ясно, спрашивают ли они точно так же, и ни один из ответов, похоже, не касается вашей конкретной проблемы.

Мне удалось найти решение, основанное на другом ответе . Честно говоря, я не совсем понимаю, что на самом деле означают цифры, я понял (более или менее), что они работают методом проб и ошибок.

import matplotlib.pyplot as plt
import mpl_toolkits.mplot3d


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

ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')

ax.xaxis._axinfo['juggled'] = 0, 0, 0
ax.yaxis._axinfo['juggled'] = 1, 1, 1
ax.zaxis._axinfo['juggled'] = 2, 2, 2

Если вы делаете это в какой-то интерактивной среде, позвоните plt.draw(), чтобы увидеть изменения.

enter image description here

Есть еще некоторые проблемы, которые вы должны решить. Ориентация оси Y может быть не той, которую вы хотите, и читаемость надписей ниже идеальной. Надеюсь, вы найдете способ обойти это.

Имейте в виду, что вы используете атрибут, который не предназначен для использования в публичном API, и задаете ключ с именем juggled. Ожидайте, что это сломается в любой момент.

...