2015-03-13 8 views
10

Ich verwende Matplotlib um dreidimensionale Arrays zu visualisieren. Ich habe es fast so, wie ich es will, abgesehen von einem kleinen Haken ... siehe die Abbildung und die unten stehende Beschreibung von dem, was ich ihm zu tun bekommen kann und was ich es ... tun will3D-Plot mit Matplotlib: Achsen ausblenden, Achsenbezeichnungen aber beibehalten?

  1. Zeigen Sie eine Reihe von Würfeln mit Etiketten, aber auch eine Menge anderer Sachen.
  2. Zeigen Sie eine Reihe von Würfeln, aber keine Achsenbeschriftungen.
  3. Dies ist, was ich will, aber es nicht tun kann ... Ich möchte eine Reihe von Würfeln mit Achsen-Etiketten, aber sonst nichts anzeigen.

enter image description here

Ich hoffe, euch mir :) Im folgenden sehen Sie die Quelle helfen kann.

from mpl_toolkits.mplot3d import axes3d 
import matplotlib.pyplot as plt 
from matplotlib import rcParams 
import numpy as np 
rcParams['axes.labelsize'] = 14 
rcParams['axes.titlesize'] = 16 
rcParams['xtick.labelsize'] = 14 
rcParams['ytick.labelsize'] = 14 
rcParams['legend.fontsize'] = 14 
rcParams['font.family'] = 'serif' 
rcParams['font.serif'] = ['Computer Modern Roman'] 
rcParams['text.usetex'] = True 
rcParams['grid.alpha'] = 0.0 

def make_cube(): 
    """ A Cube consists of a bunch of planes...""" 

    planes = { 
     "top" : ([[0,1],[0,1]], [[0,0],[1,1]], [[1,1],[1,1]]), 
     "bottom" : ([[0,1],[0,1]], [[0,0],[1,1]], [[0,0],[0,0]]), 
     "left" : ([[0,0],[0,0]], [[0,1],[0,1]], [[0,0],[1,1]]), 
     "right" : ([[1,1],[1,1]], [[0,1],[0,1]], [[0,0],[1,1]]), 
     "front" : ([[0,1],[0,1]], [[0,0],[0,0]], [[0,0],[1,1]]), 
     "back" : ([[0,1],[0,1]], [[1,1],[1,1]], [[0,0],[1,1]]) 
    } 
    return planes 

def render_array(ary, highlight): 
    fig = plt.figure() 
    ax = fig.add_subplot(111, projection='3d') 

    cube = make_cube() 

    for space in xrange(0, ary.shape[0]): 
     for column in xrange(0, ary.shape[1]): 
      for row in xrange(0, ary.shape[2]): 
       alpha = 0.01 
       if highlight[space,column,row] == 1: 
        alpha = 1 
       for side in cube: 
        (Xs, Ys, Zs) = (
         np.asarray(cube[side][0])+space+space*0.2, 
         np.asarray(cube[side][2])+row+row*0.2, 
         np.asarray(cube[side][3])+column+column*0.2 
        ) 
        ax.plot_surface(Xs, Ys, Zs, rstride=1, cstride=1, alpha=alpha) 

    highest = 0       # Make it look cubic 
    for size in ary.shape: 
     if size > highest: 
      highest = size 
    ax.set_xlim((0,highest)) 
    ax.set_ylim((0,highest)) 
    ax.set_zlim((0,highest)) 


    ax.set_xlabel('Third dimension') # Meant to visualize ROW-MAJOR ordering 
    ax.set_ylabel('Row(s)') 
    ax.set_zlabel('Column(s)') 

    #plt.axis('off') # This also removes the axis labels... i want those... 
    #ax.set_axis_off() # this removes too much (also the labels) 

    # So I try this instead... 
    ax.set_xticks([])   # removes the ticks... great now the rest of it 
    ax.set_yticks([]) 
    ax.set_zticks([]) 
    #ax.grid(False)    # this does nothing.... 
    #ax.set_frame_on(False)  # this does nothing.... 
    plt.show() 

def main(): 

    subject = np.ones((3,4,3)) 

    highlight = np.zeros(subject.shape) # Highlight a row 
    highlight[1,1,:] = 1 

    render_array(subject, highlight) # Show it 

if __name__ == "__main__": 
    main() 

aktualisieren dank der Antwort ist hier, was ich fehlte:

# Get rid of the panes       
ax.w_xaxis.set_pane_color((1.0, 1.0, 1.0, 0.0)) 
ax.w_yaxis.set_pane_color((1.0, 1.0, 1.0, 0.0)) 
ax.w_zaxis.set_pane_color((1.0, 1.0, 1.0, 0.0)) 

# Get rid of the spines       
ax.w_xaxis.line.set_color((1.0, 1.0, 1.0, 0.0)) 
ax.w_yaxis.line.set_color((1.0, 1.0, 1.0, 0.0)) 
ax.w_zaxis.line.set_color((1.0, 1.0, 1.0, 0.0)) 

Welche wird zusammen mit:

# Get rid of the ticks       
ax.set_xticks([])        
ax.set_yticks([])        
ax.set_zticks([]) 

alles, aber die Etiketten ausblenden, wie illustriert in 3).

UPDATE

Ich habe gereinigt und bekam den Code in einen funktionierenden Zustand und machte es hier zur Verfügung: https://github.com/safl/ndarray_plot

Zusammen mit ein paar weiteren Beispielen hier: http://nbviewer.ipython.org/github/safl/ndarray_plot/blob/master/nb/ndap.ipynb

+0

Nur eine Notiz Sie wissen zu lassen - später ausdrücklich eine ungewöhnliche (das heißt cool) einschließlich Anwendungsfall für andere wirklich hilfreich ist! – uhoh

Antwort

3

Ich habe versucht, den Code auszuführen, aber auf meinem Computer funktioniert es nicht.

Unten sehen Sie eine Lösung zum Zeichnen einer Kugel. Grundsätzlich habe ich die Farbe der Scheiben und Stacheln von Hand auf alpha=0 gestellt und mache die Ticks zu leeren Listen (wie du schon sagtest).

from mpl_toolkits.mplot3d import axes3d 
import matplotlib.pyplot as plt 
from matplotlib import rcParams 
import numpy as np 
rcParams['axes.labelsize'] = 18 
rcParams['font.family'] = 'serif' 
rcParams['font.serif'] = ['Computer Modern Roman'] 
rcParams['text.usetex'] = True 

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

u = np.linspace(0, 2 * np.pi, 100) 
v = np.linspace(0, np.pi, 100) 

x = 10 * np.outer(np.cos(u), np.sin(v)) 
y = 10 * np.outer(np.sin(u), np.sin(v)) 
z = 10 * np.outer(np.ones(np.size(u)), np.cos(v)) 
ax.plot_surface(x, y, z, rstride=4, cstride=4, color='b') 

# Get rid of the panes 
ax.w_xaxis.set_pane_color((1.0, 1.0, 1.0, 0.0)) 
ax.w_yaxis.set_pane_color((1.0, 1.0, 1.0, 0.0)) 
ax.w_zaxis.set_pane_color((1.0, 1.0, 1.0, 0.0)) 

# Get rid of the spines 
ax.w_xaxis.line.set_color((1.0, 1.0, 1.0, 0.0)) 
ax.w_yaxis.line.set_color((1.0, 1.0, 1.0, 0.0)) 
ax.w_zaxis.line.set_color((1.0, 1.0, 1.0, 0.0)) 

# Get rid of the ticks 
ax.set_xticks([]) 
ax.set_yticks([]) 
ax.set_zticks([]) 

# Add the labels 
ax.set_xlabel('Third dimension') 
ax.set_ylabel('Row(s)') 
ax.set_zlabel('Column(s)') 
plt.show() 

Und hier ist mein Ausgang

enter image description here

+0

Dank @nicoguaro, fehlte mir: "ax.w_xaxis.set_pane_color" und "ax.w_xaxis.line.set_color". – safl

+0

Kein Problem. Kannst du deinen Code reparieren? Ich bin daran interessiert, es auszuführen ... Vielleicht kann ich es später zur Visualisierung von Tensoren verwenden. – nicoguaro

+3

Ich habe es aufgeräumt und es hier verfügbar gemacht: https://github.com/safl/tarray_plot – safl