2016-06-22 19 views
6

Mein Setup:

Debian Linux 8.3 amd64, XMonad WM, python2.7, matplotlib 1.5.1Wie für matplotlib Graphen nach Show setzen tight_layout()

Problem:

Ich bin Herstellung einer Handlung, zum Beispiel:

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() 

und da ich Tiling bin mit, wird das matplotlib Fenster zu einer Kachel gestreckt. Leider macht dies die Graphen klein und Layout etwas locker.

Wenn ich es ein wenig "straffen" will, macht das Klicken auf "Configure subplots-> Tight Layout" die Aufgabe. Aber das bedeutet, ich muss auf das Symbol und dann auf die Schaltfläche jedes Mal klicken und da ich dieses Diagramm verwenden, um Testdaten anzuzeigen und es sehr oft auszuführen, ist es ziemlich ärgerlich. Also habe ich versucht, ein paar Dinge zu machen dies einfacher:

Was habe ich versucht:

  • Aufruf plt.tight_layout() vor show():

    ... 
    ax2.plot(x, y2) 
    
    plt.tight_layout() 
    plt.show() 
    
  • Zugabe keypress Handler (so würde ich nur drücken "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() 
    
  • tight_layout auf Figur Aufruf:

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

Alles nichts geändert oder zumindest sah es das gleiche für zwei Handlungsstränge in einer Reihe, jedoch für mehr als eine Zeile, es ist das Layout noch locker gemacht und alle Teilplattformen extrem klein.

Was ich vermute:

Ich glaube, das Problem in Bezug auf die Größe, die passiert, wahrscheinlich nach dem Fenster erstellt wird, so dass die tighten_layout Arbeiten mit Original-Fenster Dimensionen. Wenn der Window Manager das Fenster ändert die Größe, behält das Layout die subplot Größen und ich habe ein „loses“ Layout mit Miniatur-Graphen ..

Die Frage

Gibt es eine Möglichkeit, um automatisch (oder sehr leicht - wie mit einem key_press_event) straffen das Layout, auch wenn das Fenster wird die Größe sofort nach Aufruf plt.show()?

+1

Ich würde auch gerne wissen. – user1350191

+1

@ user1350191 Thomas 'Antwort unten arbeitete für mich ... –

Antwort

3

Mit Hilfe von Matplotlib event handling können Sie erreichen, was Sie wollen.Schreiben Sie einfach eine kleine Funktion, die tight_layout und aktualisiert die Zahl jedes Mal die Figur der Größe verändert ruft:

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() 

Es gibt natürlich eine kleine Chance, dass dieses System oder versionsabhängig ist. Ich habe das obige Beispiel auf MacOS Sierra mit Python 3.5.4 (Matplotlib 2.0.2) und mit Python 2.7.14 (Matplotlib 2.1.0) verifiziert. Hoffe das hilft.

EDIT:

In der Tat, ich glaube, Ihre keypress Handler gearbeitet haben würde, wenn man die Figur nach tight_layout aktualisiert haben würde, das heißt, wenn Sie fig.canvas.draw() genannt habe.