wake-up-neo.com

Festlegen der Größe der Zeichenfläche in Matplotlib

Ich möchte, dass Matplotlib/Pyplot Plots mit einer einheitlichen Leinwandgröße generiert. Das heißt, die Figuren können durchaus unterschiedliche Größen haben, um die Achsenbeschreibungen aufzunehmen, aber der Plotbereich (das Rechteck, in dem die Kurven gezeichnet werden) sollte immer dieselbe Größe haben.

Gibt es einen einfachen Weg, das zu erreichen? Die Option figsize von pyplot.figure () scheint die Gesamtgröße der Figur und nicht die der Leinwand zu bestimmen. Daher bekomme ich immer dann eine andere Leinwandgröße, wenn die Achsenbeschreibung mehr oder weniger Platz beansprucht.

14
Dario

Dies ist eine meiner größten Frustrationen bei Matplotlib. Ich arbeite oft mit Rasterdaten, wo ich zum Beispiel eine Farbkarte, eine Legende und einen Titel hinzufügen möchte. Jedes einfache Beispiel aus der Matplotlib-Galerie führt zu einer anderen Auflösung und damit zu einer erneuten Abtastung der Daten. Insbesondere bei der Bildanalyse möchten Sie kein (unerwünschtes) Resampling.

Das mache ich normalerweise, obwohl ich gerne wissen würde, ob es einfachere oder bessere Wege gibt.

Beginnen wir mit dem Laden eines Bildes und dessen Ausgabe, so wie es ist, mit derselben Auflösung:

import matplotlib.pyplot as plt
import urllib2

# load the image
img = plt.imread(urllib2.urlopen('http://upload.wikimedia.org/wikipedia/en/thumb/5/56/Matplotlib_logo.svg/500px-Matplotlib_logo.svg.png'))

# get the dimensions
ypixels, xpixels, bands = img.shape

# get the size in inches
dpi = 72.
xinch = xpixels / dpi
yinch = ypixels / dpi

# plot and save in the same size as the original
fig = plt.figure(figsize=(xinch,yinch))

ax = plt.axes([0., 0., 1., 1.], frameon=False, xticks=[],yticks=[])
ax.imshow(img, interpolation='none')

plt.savefig('D:\\mpl_logo.png', dpi=dpi, transparent=True)

Beachten Sie, dass ich die Achsenposition manuell definiert habe, so dass sich die gesamte Figur erstreckt.

Auf ähnliche Weise wie oben können Sie einen Rand um das Bild einfügen, um Beschriftungen oder Farbbalken usw. zuzulassen.

Dieses Beispiel fügt einen Rand von 20% über dem Bild hinzu, der dann zum Zeichnen eines Titels verwendet wird:

fig = plt.figure(figsize=(xinch,yinch/.8))

ax = plt.axes([0., 0., 1., .8], frameon=False, xticks=[],yticks=[])
ax.imshow(img, interpolation='none')
ax.set_title('Matplotlib is fun!', size=16, weight='bold')

plt.savefig('D:\\mpl_logo_with_title.png', dpi=dpi)

Die y-Größe (Höhe) wird also vergrößert und die y-Größe der Achsen wird gleichmäßig verringert. Dies ergibt ein größeres (insgesamt) Ausgabebild, aber der Achsenbereich hat immer noch die gleiche Größe. 

Es könnte Nizza sein, wenn eine Figur oder Achseneigenschaft wie .set_scale () eine echte 1-on-x-Ausgabe erzwingen. 

12
Rutger Kassies

In Matplotlib rc können Sie folgende Einstellungen festlegen:

import matplotlib
matplotlib.rcParams['figure.figsize'] = [10, 10] # for square canvas
matplotlib.rcParams['figure.subplot.left'] = 0
matplotlib.rcParams['figure.subplot.bottom'] = 0
matplotlib.rcParams['figure.subplot.right'] = 1
matplotlib.rcParams['figure.subplot.top'] = 1
0