2013-03-15 3 views
5

Unten ist eine Figur, die ich mit Matplotlib erstellt habe. Das Problem ist ziemlich offensichtlich - die Etiketten überschneiden sich und das Ganze ist ein unlesbares Durcheinander.Was kann ich bei den überlappenden Labels in diesen Teilplots tun?

enter image description here

Ich versuchte tight_layout für jeden subplot Aufruf, aber das ist mein ipython-Notebook-Kernel abstürzt.

Was kann ich tun, um das Layout zu reparieren? Zu den akzeptablen Vorgehensweisen gehören das Fixieren von X-Label, Y-Label und Titel für jedes Subplot, aber ein anderer (und vielleicht besserer) Ansatz wäre, ein einzelnes X-Label, Y-Label und Titel für die gesamte Figur zu haben.

Hier ist die Schleife ich verwendet, um die oben Nebenhandlungen zu generieren:

for i, sub in enumerate(datalist): 
    subnum = i + start_with 
    subplot(3, 4, i) 

    # format data (sub is a PANDAS dataframe) 
    xdat = sub['x'][(sub['in_trl'] == True) & (sub['x'].notnull()) & (sub['y'].notnull())] 
    ydat = sub['y'][(sub['in_trl'] == True) & (sub['x'].notnull()) & (sub['y'].notnull())] 

    # plot 
    hist2d(xdat, ydat, bins=1000) 
    plot(0, 0, 'ro') # origin 

    title('Subject {0} in-Trial Gaze'.format(subnum)) 
    xlabel('Horizontal Offset (degrees visual angle)') 
    ylabel('Vertical Offset (degrees visual angle)') 

    xlim([-.005, .005]) 
    ylim([-.005, .005]) 
    # tight_layout # crashes ipython-notebook kernel 

show() 

Update:

Okay, so ImageGrid der Weg zu sein scheint zu gehen, aber meine Figur sucht noch ein bisschen wackelig:

enter image description here

Hier ist der Code, den ich verwendet:

fig = figure(dpi=300) 
grid = ImageGrid(fig, 111, nrows_ncols=(3, 4), axes_pad=0.1) 

for gridax, (i, sub) in zip(grid, enumerate(eyelink_data)): 
    subnum = i + start_with 

    # format data 
    xdat = sub['x'][(sub['in_trl'] == True) & (sub['x'].notnull()) & (sub['y'].notnull())] 
    ydat = sub['y'][(sub['in_trl'] == True) & (sub['x'].notnull()) & (sub['y'].notnull())] 

    # plot 
    gridax.hist2d(xdat, ydat, bins=1000) 
    plot(0, 0, 'ro') # origin 

    title('Subject {0} in-Trial Gaze'.format(subnum)) 
    xlabel('Horizontal Offset\n(degrees visual angle)') 
    ylabel('Vertical Offset\n(degrees visual angle)') 

    xlim([-.005, .005]) 
    ylim([-.005, .005]) 

show() 
+0

Es ist ein Kochbuch Beispiel: http://www.scipy.org/Cookbook/Matplotlib/Multiple_Subplots_with_One_Axis_Label (mehrere Beispiele in der Tat) –

+0

fyi: 'tight_layout' sollte in der Figureninstanz aufgerufen werden, nicht die Achsen. "ImageGrid" ist jedoch der beste Weg zu gehen, IMO –

+0

@PaulH, ack rechts. Schöner Fang! Vielen Dank! Edit: Das heißt, Sie würden denken, dass es eine explizite Ausnahme auslösen würde =/ – blz

Antwort

3

Sie wollen ImageGrid (tutorial).

Erstes Beispiel angehoben unmittelbar von diesem Link (und leicht modifiziert):

import matplotlib.pyplot as plt 
from mpl_toolkits.axes_grid1 import ImageGrid 
import numpy as np 

im = np.arange(100) 
im.shape = 10, 10 

fig = plt.figure(1, (4., 4.)) 
grid = ImageGrid(fig, 111, # similar to subplot(111) 
       nrows_ncols = (2, 2), # creates 2x2 grid of axes 
       axes_pad=0.1, # pad between axes in inch. 
       aspect=False, # do not force aspect='equal' 
       ) 

for i in range(4): 
    grid[i].imshow(im) # The AxesGrid object work as a list of axes. 

plt.show() 
+0

genial! Ich werde es in ein paar Minuten versuchen! – blz

+0

Ich habe versucht, 'ImageGrid' zu verwenden, wie Sie vorgeschlagen haben, aber ich bekomme immer noch merkwürdige Ergebnisse. Meine Achsen sind nicht richtig groß und meine Xlims und Ylims werden nicht berücksichtigt - ich habe meine Frage mit Beispielcode und einer neuen Figur aktualisiert. Irgendwelche Gedanken? – blz

+0

@blz siehe bearbeiten. – tacaswell

Verwandte Themen