2016-06-22 10 views
6

Moja konfiguracja:

Linux Debian 8.3 amd64, xmonad WM, python2.7, matplotlib 1.5.1Jak ustawić tight_layout dla matplotlib wykresach po show()

Problem:

jestem podejmowania działkę, na przykład:

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

a ponieważ Używam menedżera okien dachówka, okno na matplotlib dostaje rozciągnięty do dachówki. Niestety powoduje to, że wykresy są niewielkie i układy są luźne.

Jeśli chcę "dokręcić" go trochę, klikając "Konfiguruj wątki -> Tight Układ" wykonuje zadanie. Ale to oznacza, że ​​muszę kliknąć ikonę, a następnie na przycisk za każdym razem, gdy i ponieważ używam tego wykresu do wyświetlania danych testowych i uruchamiam go bardzo często, to jest dość denerwujące. Więc próbowałem kilka rzeczy, aby to łatwiejsze:

Co próbowałem:

  • nazywając plt.tight_layout() przed show():

    ... 
    ax2.plot(x, y2) 
    
    plt.tight_layout() 
    plt.show() 
    
  • dodanie obsługi przyciśnięcie (tak, ja po prostu naciśnij "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() 
    
  • nazywając tight_layout na rysunku:

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

To wszystko zmieniło się nic, a przynajmniej wyglądał tak samo na 2 wątków w jednym rzędzie, jednak na więcej niż jeden wiersz, to sprawiło, że układ jeszcze bardziej luźne i wszystkie wątki bardzo małe.

Co Podejrzewam:

Wierzę, że problem jest związany z rozmiaru, które prawdopodobnie dzieje się po utworzeniu okna , więc tighten_layout współpracuje z oryginalnego okna wymiarach. Gdy Window Manager zmienia rozmiar okna, układ zachowuje rozmiary poletko i mam „luźne” układ z miniaturowych wykresów ..

Pytanie

Czy istnieje sposób, aby automatycznie (lub bardzo łatwo - jak za pomocą key_press_event) dokręcić układ, nawet gdy okno zostanie zmienione natychmiast po dzwoniąc pod numer plt.show()?

+1

Chciałbym również wiedzieć. – user1350191

+1

@ user1350191 Poniższa odpowiedź Thomasa zadziałała dla mnie ... –

Odpowiedz

3

Możesz osiągnąć to, co chcesz, za pomocą Matplotlib event handling.Wystarczy napisać niewielką funkcję, która wywołuje tight_layout i aktualizuje rysunek każdym razem, gdy postać jest zmieniany:

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

Istnieje oczywiście mała szansa, że ​​jest to wersja systemu lub zależne. Sprawdziłem powyższy przykład na MacOS Sierra z Pythonem 3.5.4 (Matplotlib 2.0.2) oraz z Pythonem 2.7.14 (Matplotlib 2.1.0). Mam nadzieję że to pomoże.

EDIT:

W rzeczywistości, myślę, że Twój obsługi przyciśnięcie będzie pracował jeśli byś zaktualizował figurę po tight_layout, to znaczy, jeśli byś nazwał fig.canvas.draw().

Powiązane problemy