Ich kann nicht erreichen, dass die Farbleiste in Imshow-Diagrammen wie diesem die gleiche Höhe wie das Diagramm hat, ohne dass Photoshop nachträglich verwendet wird. Wie bekomme ich die passenden Höhen?
fraction
oder shrink
args.
Ich kann nicht erreichen, dass die Farbleiste in Imshow-Diagrammen wie diesem die gleiche Höhe wie das Diagramm hat, ohne dass Photoshop nachträglich verwendet wird. Wie bekomme ich die passenden Höhen?
fraction
oder shrink
args.
Antworten:
Sie können dies einfach mit einem matplotlib AxisDivider tun .
Das Beispiel auf der verlinkten Seite funktioniert auch ohne Verwendung von Nebenhandlungen:
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable
import numpy as np
plt.figure()
ax = plt.gca()
im = ax.imshow(np.arange(100).reshape((10,10)))
# create an axes on the right side of ax. The width of cax will be 5%
# of ax and the padding between cax and ax will be fixed at 0.05 inch.
divider = make_axes_locatable(ax)
cax = divider.append_axes("right", size="5%", pad=0.05)
plt.colorbar(im, cax=cax)
plt.title
, wird dieser nach rechts vertauscht angezeigt. Gibt es eine Möglichkeit, dies zu überwinden?
Diese Kombination (und Werte in der Nähe dieser Werte) scheint für mich "magisch" zu funktionieren, um die Farbleiste auf das Diagramm skaliert zu halten, unabhängig von der Größe der Anzeige.
plt.colorbar(im,fraction=0.046, pad=0.04)
Es ist auch nicht erforderlich, die Achse zu teilen, wodurch das Diagramm aus dem Quadrat geraten kann.
im_ratio = data.shape[0]/data.shape[1]
plt.colorbar(im,fraction=0.046*im_ratio, pad=0.04)
Wo data
ist Ihr Bild ?
@bogatron gab bereits die Antwort, die von den matplotlib-Dokumenten vorgeschlagen wurde , wodurch die richtige Höhe erzeugt wird, aber es kommt zu einem anderen Problem. Jetzt ändert sich die Breite der Farbleiste (sowie der Abstand zwischen Farbleiste und Plot) mit der Breite des Plots. Mit anderen Worten, das Seitenverhältnis der Farbleiste ist nicht mehr festgelegt.
Um sowohl die richtige Höhe als auch ein bestimmtes Seitenverhältnis zu erhalten, müssen Sie etwas tiefer in das mysteriöse axes_grid1
Modul eintauchen.
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable, axes_size
import numpy as np
aspect = 20
pad_fraction = 0.5
ax = plt.gca()
im = ax.imshow(np.arange(200).reshape((20, 10)))
divider = make_axes_locatable(ax)
width = axes_size.AxesY(ax, aspect=1./aspect)
pad = axes_size.Fraction(pad_fraction, width)
cax = divider.append_axes("right", size=width, pad=pad)
plt.colorbar(im, cax=cax)
Beachten Sie, dass dies die Breite des Farbbalkens in Bezug auf die Höhe des Diagramms angibt (im Gegensatz zur Breite der Abbildung wie zuvor).
Der Abstand zwischen Farbbalken und Plot kann jetzt als Bruchteil der Breite des Farbbalkens angegeben werden, was meiner Meinung nach eine viel aussagekräftigere Zahl ist als ein Bruchteil der Figurenbreite.
AKTUALISIEREN:
Ich habe ein IPython-Notizbuch zu diesem Thema erstellt , in dem ich den obigen Code in eine leicht wiederverwendbare Funktion gepackt habe:
import matplotlib.pyplot as plt
from mpl_toolkits import axes_grid1
def add_colorbar(im, aspect=20, pad_fraction=0.5, **kwargs):
"""Add a vertical color bar to an image plot."""
divider = axes_grid1.make_axes_locatable(im.axes)
width = axes_grid1.axes_size.AxesY(im.axes, aspect=1./aspect)
pad = axes_grid1.axes_size.Fraction(pad_fraction, width)
current_ax = plt.gca()
cax = divider.append_axes("right", size=width, pad=pad)
plt.sca(current_ax)
return im.axes.figure.colorbar(im, cax=cax, **kwargs)
Es kann folgendermaßen verwendet werden:
im = plt.imshow(np.arange(200).reshape((20, 10)))
add_colorbar(im)
Ich schätze alle obigen Antworten. Jedoch, wie einige Antworten und Kommentare darauf hingewiesen, das axes_grid1
kann Modul nicht - Adresse GeoAxes, während Einstellung fraction
, pad
, shrink
und andere ähnliche Parameter nicht unbedingt gibt die sehr präzise Ordnung, die wirklich stört mich. Ich glaube, dass es eine bessere Lösung colorbar
sein axes
könnte , das Eigene zu geben, um alle genannten Probleme anzugehen.
import matplotlib.pyplot as plt
import numpy as np
fig=plt.figure()
ax = plt.axes()
im = ax.imshow(np.arange(100).reshape((10,10)))
# Create an axes for colorbar. The position of the axes is calculated based on the position of ax.
# You can change 0.01 to adjust the distance between the main image and the colorbar.
# You can change 0.02 to adjust the width of the colorbar.
# This practice is universal for both subplots and GeoAxes.
cax = fig.add_axes([ax.get_position().x1+0.01,ax.get_position().y0,0.02,ax.get_position().height])
plt.colorbar(im, cax=cax) # Similar to fig.colorbar(im, cax = cax)
Später finde ich, dass die matplotlib.pyplot.colorbar
offizielle Dokumentation auch ax
Optionen bietet , bei denen es sich um vorhandene Achsen handelt, die Platz für die Farbleiste bieten. Daher ist es nützlich für mehrere Unterzeichnungen, siehe unten.
fig, ax = plt.subplots(2,1,figsize=(12,8)) # Caution, figsize will also influence positions.
im1 = ax[0].imshow(np.arange(100).reshape((10,10)), vmin = -100, vmax =100)
im2 = ax[1].imshow(np.arange(-100,0).reshape((10,10)), vmin = -100, vmax =100)
fig.colorbar(im1, ax=ax)
Auch hier können Sie ähnliche Effekte erzielen, indem Sie cax angeben, was aus meiner Sicht genauer ist.
fig, ax = plt.subplots(2,1,figsize=(12,8))
im1 = ax[0].imshow(np.arange(100).reshape((10,10)), vmin = -100, vmax =100)
im2 = ax[1].imshow(np.arange(-100,0).reshape((10,10)), vmin = -100, vmax =100)
cax = fig.add_axes([ax[1].get_position().x1-0.25,ax[1].get_position().y0,0.02,ax[0].get_position().y1-ax[1].get_position().y0])
fig.colorbar(im1, cax=cax)
Wenn Sie den colorbar
Versuch mit den Bruch- und / oder Verkleinerungsparametern erstellen .
Aus den Dokumenten:
Fraktion 0,15; Bruchteil der ursprünglichen Achsen, die für die Farbleiste verwendet werden sollen
schrumpfen 1,0; Bruchteil, um den der Farbbalken verkleinert werden soll
colorbar()
Funktion oder Methode sein.
Alle oben genannten Lösungen sind gut, aber ich mag @ Steve's und @ bejota's am besten, da sie keine ausgefallenen Anrufe beinhalten und universell sind.
Mit universell meine ich, dass es mit jeder Art von Achsen funktioniert, einschließlich GeoAxes
. Sie haben beispielsweise Achsen für die Zuordnung projiziert:
projection = cartopy.crs.UTM(zone='17N')
ax = plt.axes(projection=projection)
im = ax.imshow(np.arange(200).reshape((20, 10)))
ein Anruf bei
cax = divider.append_axes("right", size=width, pad=pad)
wird scheitern mit: KeyException: map_projection
Daher ist die einzige universelle Möglichkeit, die Farbbalkengröße mit allen Arten von Achsen zu behandeln, folgende:
ax.colorbar(im, fraction=0.046, pad=0.04)
Arbeiten Sie mit einem Bruchteil von 0,035 bis 0,046, um die beste Größe zu erhalten. Die Werte für Bruch und Paddig müssen jedoch angepasst werden, um die beste Anpassung für Ihr Diagramm zu erzielen. Sie unterscheiden sich je nachdem, ob die Ausrichtung der Farbleiste vertikal oder horizontal ist.
shrink
Parameter hinzufügen , wenn fraction
zusammen mit pad
nicht genügend gewünschte Ergebnisse erzielt werden.