2016-06-22 27 views
6

La mia configurazione:

Debian Linux 8.3 amd64, XMonad WM, python2.7, matplotlib 1.5.1Come impostare tight_layout per i grafici matplotlib dopo lo show()

Problema:

Sono facendo una trama, ad esempio:

import matplotlib.pyplot as plt 

x = xrange(10) 
y1 = [i ** 2 for i in x] 
y2 = [1.0/(i + 1) for i in x] 

fig = plt.figure() 
ax1 = plt.subplot(1, 2, 1) 
ax1.plot(x, y1) 
ax2 = plt.subplot(1, 2, 2) 
ax2.plot(x, y2) 

plt.show() 

e dato che sto usando la finestra piastrelle manager, la finestra del matplotlib ottiene allungato per una piastrella. Purtroppo questo rende i grafici piccoli e il layout un po 'allentato.

Se si desidera "stringere" un bit, fare clic su "Configura sottopagine-> Tight Layout" fa il lavoro. Ma questo significa che devo cliccare sull'icona e poi sul pulsante ogni volta e dato che io uso questa trama per visualizzare i dati di test ed eseguirlo molto spesso, è abbastanza fastidioso. Così ho provato un paio di cose per rendere questo più facile:

Che cosa ho provato:

  • chiamando plt.tight_layout() prima show():

    ... 
    ax2.plot(x, y2) 
    
    plt.tight_layout() 
    plt.show() 
    
  • aggiungendo gestore pressione di un tasto (così mi sarebbe sufficiente premere "t"):

    ... 
    ax2.plot(x, y2) 
    
    def kbd_handler(event): 
        if event.key == 't': 
         plt.tight_layout() 
    
    plt.gcf().canvas.mpl_connect('key_press_event', kbd_handler) 
    plt.show() 
    
  • chiamando tight_layout sulla figura:

    ax2.plot(x, y2) 
    
    fig.tight_layout() 
    plt.show() 
    

Tutto cambiato nulla o almeno sembrava lo stesso per 2 sottotrame in una riga, tuttavia per più di una riga, si fece il layout ancora più sciolto e tutte le sottotrame estremamente piccole.

Quello che sospetto:

Credo che il problema è legato al ridimensionamento che probabilmente accade dopo la creazione della finestra , in modo che le opere con tighten_layout finestra originale dimensioni. Quando il Window Manager ridimensiona la finestra, il layout mantiene le dimensioni sottotrama e ho un layout "loose" con grafici in miniatura ..

La domanda

C'è un modo per automaticamente (o molto facilmente - come utilizzando un key_press_event) stringere il layout anche quando la finestra viene ridimensionata immediatamente dopo chiamando plt.show()?

+1

Mi piacerebbe saperlo. – user1350191

+1

@ user1350191 La risposta di Thomas sotto ha funzionato per me ... –

risposta

3

È possibile ottenere ciò che si desidera con l'aiuto di Matplotlib event handling.Basta scrivere una piccola funzione che chiama tight_layout e aggiorna la figura ogni volta che la cifra si ridimensiona:

from matplotlib import pyplot as plt 
import numpy as np 

x = np.linspace(0,np.pi,100) 
y1 = np.sin(x) 
y2 = np.cos(x) 
fig, (ax1,ax2) = plt.subplots(nrows=1, ncols=2) 
fig.tight_layout() 
ax1.plot(x,y1) 
ax2.plot(x,y2) 

def on_resize(event): 
    fig.tight_layout() 
    fig.canvas.draw() 

cid = fig.canvas.mpl_connect('resize_event', on_resize) 

plt.show() 

Naturalmente c'è una piccola possibilità che questo è il sistema o la versione dipendente. Ho verificato l'esempio precedente su MacOS Sierra con Python 3.5.4 (Matplotlib 2.0.2) e con Python 2.7.14 (Matplotlib 2.1.0). Spero che questo ti aiuti.

EDIT:

In realtà, credo che il tuo gestore di pressione dei tasti avrebbe funzionato se avrebbe aggiornato la cifra dopo tight_layout, vale a dire se avrebbe chiamato fig.canvas.draw().

Problemi correlati