it-swarm.com.de

Wie kann pylab.savefig () das Bild für das maximierte Fenster anstelle der Standardgröße speichern?

Ich verwende Pylab in Matplotlib, um ein Diagramm zu erstellen und das Diagramm in einer Bilddatei zu speichern. Wenn ich jedoch das Bild mithilfe von pylab.savefig( image_name ) speichere, stelle ich fest, dass das gespeicherte BildSIZEmit dem Bild identisch ist, das bei Verwendung von pylab.show() angezeigt wird.

Zufällig habe ich viele Daten in der Grafik und wenn ich pylab.show() verwende, muss ich das Fenster maximieren, bevor ich die gesamte Grafik richtig sehen kann und die xlabel-Ticker nicht übereinander liegen.

Gibt es überhaupt eine Möglichkeit, das Fenster programmgesteuert zu "maximieren", bevor das Bild in eine Datei gespeichert wird? - Im Moment bekomme ich nur das "Standard" -Fensterbild, das dazu führt, dass die Beschriftungen der X-Achse übereinander liegen.

41

Sie legen die Größe bei der Initialisierung fest:

fig2 = matplotlib.pyplot.figure(figsize=(8.0, 5.0)) # in inches!

Bearbeiten :

Wenn das Problem mit X-Achsen-Ticks zusammenhängt - Sie können sie "manuell" einstellen:

fig2.add_subplot(111).set_xticks(arange(1,3,0.5)) # You can actually compute the interval You need - and substitute here

Und so weiter mit anderen Aspekten Ihrer Handlung. Sie können alles konfigurieren. Hier ist ein Beispiel:

from numpy import arange
import matplotlib
# import matplotlib as mpl
import matplotlib.pyplot
# import matplotlib.pyplot as plt

x1 = [1,2,3]
y1 = [4,5,6]
x2 = [1,2,3]
y2 = [5,5,5]

# initialization
fig2 = matplotlib.pyplot.figure(figsize=(8.0, 5.0)) # The size of the figure is specified as (width, height) in inches

# lines:
l1 = fig2.add_subplot(111).plot(x1,y1, label=r"Text $formula$", "r-", lw=2)
l2 = fig2.add_subplot(111).plot(x2,y2, label=r"$legend2$" ,"g--", lw=3)
fig2.add_subplot(111).legend((l1,l2), loc=0)

# axes:
fig2.add_subplot(111).grid(True)
fig2.add_subplot(111).set_xticks(arange(1,3,0.5))
fig2.add_subplot(111).axis(xmin=3, xmax=6) # there're also ymin, ymax
fig2.add_subplot(111).axis([0,4,3,6]) # all!
fig2.add_subplot(111).set_xlim([0,4])
fig2.add_subplot(111).set_ylim([3,6])

# labels:
fig2.add_subplot(111).set_xlabel(r"x $2^2$", fontsize=15, color = "r")
fig2.add_subplot(111).set_ylabel(r"y $2^2$")
fig2.add_subplot(111).set_title(r"title $6^4$")
fig2.add_subplot(111).text(2, 5.5, r"an equation: $E=mc^2$", fontsize=15, color = "y")
fig2.add_subplot(111).text(3, 2, unicode('f\374r', 'latin-1'))

# saving:
fig2.savefig("fig2.png")

Was genau möchten Sie also konfigurieren?

23
Adobe

In Matplotlib (Pylab) gibt es zwei Hauptoptionen zur Steuerung der Bildgröße:

  1. Sie können die Größe des resultierenden Bildes in Zoll festlegen 
  2. Sie können die DPI (Punkte pro Zoll) für die Ausgabedatei festlegen (im Grunde ist es eine Auflösung).

Normalerweise möchten Sie beides, da Sie volle Kontrolle über die resultierende Bildgröße in Pixeln haben. Wenn Sie beispielsweise ein genaues 800 x 600-Bild rendern möchten, können Sie DPI = 100 verwenden und die Größe auf 8 x 6 Zoll festlegen:

import matplotlib.pyplot as plt
# plot whatever you need...
# now, before saving to file:
figure = plt.gcf() # get current figure
figure.set_size_inches(8, 6)
# when saving, specify the DPI
plt.savefig("myplot.png", dpi = 100)

Man kann jede DPI verwenden. Vielleicht möchten Sie mit verschiedenen DPI- und Größenwerten spielen, um das Ergebnis zu erhalten, das Ihnen am besten gefällt. Beachten Sie jedoch, dass die Verwendung sehr kleiner DPI keine gute Idee ist, da matplotlib möglicherweise keine geeignete Schriftart für das Rendern von Legenden und anderem Text findet. Sie können beispielsweise nicht das DPI = 1 festlegen, da keine Zeichensätze mit mit 1 Pixel gerenderten Zeichen vorhanden sind :)

Aus anderen Kommentaren habe ich verstanden, dass das andere Problem, das Sie haben, die korrekte Textwiedergabe ist. Dazu können Sie auch die Schriftgröße ändern. Sie können beispielsweise 6 Pixel pro Zeichen anstelle von standardmäßig 12 Pixeln pro Zeichen verwenden (dh, der gesamte Text wird zweimal kleiner).

import matplotlib
#...
matplotlib.rc('font', size=6)

Zum Schluss noch einige Verweise auf die Originaldokumentation: http://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot.savefig , http://matplotlib.sourceforge.net/ api/pyplot_api.html # matplotlib.pyplot.gcf , http://matplotlib.sourceforge.net/api/figure_api.html#matplotlib.figure.Figure.set_size_inches , http: // matplotlib. sourceforge.net/users/customizing.html#dynamic-rc-settings

P.S. Entschuldigung, ich habe Pylab nicht verwendet, aber soweit ich weiß, funktioniert der gesamte Code in Pylab auf dieselbe Weise. Ersetzen Sie einfach plt in meinem Code durch die pylab (oder den Namen, den Sie beim Importieren von Pylab zugewiesen haben). Gleiches gilt für matplotlib - stattdessen pylab.

43
Timur

Ich denke, Sie müssen eine andere Auflösung angeben, wenn Sie die Figur in einer Datei speichern:

fig = matplotlib.pyplot.figure()
# generate your plot
fig.savefig("myfig.png",dpi=600)

Die Angabe eines großen dpi-Werts sollte ähnlich wie das Maximieren des GUI-Fensters wirken.

7
silvado

Überprüfen Sie Folgendes: So maximieren Sie ein plt.show () - Fenster mit Python

Der Befehl unterscheidet sich je nach verwendetem Backend. Ich finde, dass dies der beste Weg ist, um sicherzustellen, dass die gespeicherten Bilder dieselbe Skalierung haben wie auf meinem Bildschirm.

Da ich Canopy mit dem QT-Backend benutze:

pylab.get_current_fig_manager().window.showMaximized()

Ich rufe dann savefig () bei Bedarf mit einer erhöhten DPI-Antwort pro Silvado an.

4
Maximus

Ich habe die gleiche Suche vor einiger Zeit durchgeführt, es scheint, dass die genaue Lösung vom Backend abhängt.

Ich habe eine Reihe von Quellen gelesen und die nützlichste war wahrscheinlich die Antwort von Pythonio hier Wie maximiere ich ein plt.show () - Fenster mit Python Es funktioniert anständig für mich unter Windows. Ich verwende meistens Qt, wo ich es oft benutze, während es mit anderen Backends minimal getestet wird.

Grundsätzlich besteht es darin, das Backend zu identifizieren und die entsprechende Funktion aufzurufen. Beachten Sie, dass ich danach eine Pause hinzugefügt habe, da ich Probleme mit einigen Fenstern hatte, die maximiert wurden, und anderen nicht. Es scheint, dass dies für mich gelöst ist. 

def maximize(backend=None,fullscreen=False):
    """Maximize window independently on backend.
    Fullscreen sets fullscreen mode, that is same as maximized, but it doesn't have title bar (press key F to toggle full screen mode)."""
    if backend is None:
        backend=matplotlib.get_backend()
    mng = plt.get_current_fig_manager()

    if fullscreen:
        mng.full_screen_toggle()
    else:
        if backend == 'wxAgg':
            mng.frame.Maximize(True)
        Elif backend == 'Qt4Agg' or backend == 'Qt5Agg':
            mng.window.showMaximized()
        Elif backend == 'TkAgg':
            mng.window.state('zoomed') #works fine on Windows!
        else:
            print ("Unrecognized backend: ",backend) #not tested on different backends (only Qt)
    plt.show()

    plt.pause(0.1) #this is needed to make sure following processing gets applied (e.g. tight_layout)
1
Vincenzooo

Wenn ich richtig verstanden habe, was Sie tun möchten, können Sie Ihre Figur erstellen und die Größe des Fensters einstellen. Anschließend können Sie Ihre Grafik mit der Matplotlib-Toolbox-Schaltfläche speichern. Hier ein Beispiel:

from pylab import get_current_fig_manager,show,plt,imshow

plt.Figure()
thismanager = get_current_fig_manager()
thismanager.window.wm_geometry("500x500+0+0") 
#in this case 500 is the size (in pixel) of the figure window. In your case you want to maximise to the size of your screen or whatever

imshow(your_data)
show()
0
maupertius