2013-07-29 25 views
8

Mi sto preparando per una presentazione e ho alcune figure di esempio di figure 3D matplotlib. Tuttavia, le linee della griglia sono troppo chiare per vedere le immagini proiettate. example 3D imageRegolazione griglia su un 3D Matplotlib figura

Ho provato ad utilizzare la griglia-metodo che funziona per le figure 2D:

points = (5*np.random.randn(3, 50)+np.tile(np.arange(1,51), (3, 1))).transpose() 
fig = plt.figure(figsize = (10,10)) 
ax = fig.add_subplot(111, projection='3d') 
ax.scatter(points[:,0], points[:,1], points[:,2]) 
ax.view_init(elev=0., azim=0) 
ax.set_ylim([0, 60]) 
ax.set_zlim([0, 60]) 
ax.set_xlim([0, 60]) 
ax.set_zlabel('Cytokine') 
ax.set_ylabel('Parameter') 
ax.grid(linewidth=20) 

Ma questo non sembra funzionare per le figure 3D. Eventuali suggerimenti?

risposta

3

Purtroppo questo non sembra essere esposto. Guardando oltre la fonte, la variabile interna chiave è chiamata _AXINFO che possiamo ignorare con un'attenta sottoclasse.

enter image description here

Aggiungere questo codice dopo aver creato la tua figura, e lo stile con il dict custom_AXINFO:

from mpl_toolkits.mplot3d import Axes3D 
import mpl_toolkits.mplot3d.axis3d as axis3d 

# New axis settings 
custom_AXINFO = { 
    'x': {'i': 0, 'tickdir': 1, 'juggled': (1, 0, 2), 
      'color': (0.00, 0.00, 0.25, .75)}, 
    'y': {'i': 1, 'tickdir': 0, 'juggled': (0, 1, 2), 
      'color': (0.20, 0.90, 0.90, 0.25)}, 
    'z': {'i': 2, 'tickdir': 0, 'juggled': (0, 2, 1), 
      'color': (0.925, 0.125, 0.90, 0.25)},} 

class custom_XAxis(axis3d.Axis): 
    _AXINFO = custom_AXINFO 

class custom_YAxis(axis3d.Axis): 
    _AXINFO = custom_AXINFO 

class custom_ZAxis(axis3d.Axis): 
    _AXINFO = custom_AXINFO 

class custom_Axes3D(Axes3D): 
    def _init_axis(self): 
     '''Init 3D axes; overrides creation of regular X/Y axes''' 
     self.w_xaxis = custom_XAxis('x', self.xy_viewLim.intervalx, 
            self.xy_dataLim.intervalx, self) 
     self.xaxis = self.w_xaxis 
     self.w_yaxis = custom_YAxis('y', self.xy_viewLim.intervaly, 
          self.xy_dataLim.intervaly, self) 
     self.yaxis = self.w_yaxis 
     self.w_zaxis = custom_ZAxis('z', self.zz_viewLim.intervalx, 
          self.zz_dataLim.intervalx, self) 
     self.zaxis = self.w_zaxis 

     for ax in self.xaxis, self.yaxis, self.zaxis: 
      ax.init3d() 

# The rest of your code below, note the call to our new custom_Axes3D 

points = (5*np.random.randn(3, 50)+np.tile(np.arange(1,51), (3, 1))).transpose() 
fig = plt.figure(figsize = (10,10)) 
ax = custom_Axes3D(fig) 

Questa è la scimmia-patching al suo peggio, e non dovrebbe essere invocata per lavoro per versioni successive.

Il fissaggio dei facecolors è stato più semplice delle linee della griglia, poiché ciò richiede l'override di uno dei metodi __init__, sebbene potrebbe essere eseguito con più lavoro.

Non sembra difficile esporlo all'utente finale, e come tale posso immaginare che possa essere risolto nelle versioni successive.

+0

Sembra che ora sia possibile eseguire ax.w_xaxis.plane.set_color ((1,0,0)); ax.w_xaxis.plane.set_alpha (0,5). Sembra che ignori il canale alfa in set_color ma usi quello in set_alpha. – Ben

16

Se non ti dispiace avere tutte le linee più spesse, allora puoi regolare le impostazioni di default rc.

Dato un grafico come:

enter image description here

Possiamo aggiungere:

import matplotlib as mpl 
mpl.rcParams['lines.linewidth'] = 2 

Per aumentare lo spessore della linea di default di tutte le linee, dando un risultato di:

enter image description here

Altern atively, se si sente questa sembra brutto, è possibile utilizzare:

ax.w_xaxis.gridlines.set_lw(3.0) 
ax.w_yaxis.gridlines.set_lw(3.0) 
ax.w_zaxis.gridlines.set_lw(3.0) 

per regolare la larghezza della linea di ciascun asse per 3,0, la produzione di:

enter image description here

Per aggiornare il colore, in modo da la griglia di linee davvero pop, si potrebbe aggiungere:

ax.w_xaxis._axinfo.update({'grid' : {'color': (0, 0, 0, 1)}}) 
ax.w_yaxis._axinfo.update({'grid' : {'color': (0, 0, 0, 1)}}) 
ax.w_zaxis._axinfo.update({'grid' : {'color': (0, 0, 0, 1)}}) 

che produce:

enter image description here

I metodi sono piuttosto hacky, ma per quanto ne so non esiste un modo più semplice per raggiungere questi risultati !! Spero che questo ti aiuti; fammi sapere se hai bisogno di ulteriore assistenza!

+0

@JudoWill - dovresti accettare questa risposta se risolve il tuo problema! – Jamie

Problemi correlati