Ich verwende matplotlib, um einige Daten in Python zu zeichnen, und die Darstellungen erfordern eine Standardfarbleiste. Die Daten bestehen aus einer Reihe von NxM-Matrizen, die Frequenzinformationen enthalten, so dass eine einfache imshow () - Darstellung ein 2D-Histogramm mit farbbeschreibender Häufigkeit ergibt. Jede Matrix enthält Daten in unterschiedlichen, aber überlappenden Bereichen. Imshow normalisiert die Daten in jeder Matrix auf den Bereich 0-1, was bedeutet, dass zum Beispiel das Diagramm der Matrix A identisch mit dem Diagramm der Matrix 2 * A erscheint (obwohl der Farbbalken die doppelten Werte anzeigt). Ich möchte beispielsweise, dass die Farbe Rot in allen Darstellungen der gleichen Frequenz entspricht. Mit anderen Worten, ein einziger Farbbalken würde für alle Diagramme ausreichen. Anregungen wären sehr dankbar.
@Anilis 'Antwort nicht zu stehlen, aber ich wollte ein Beispiel hinzufügen ...
Es gibt mehrere Möglichkeiten, aber die einfachste ist es, die Variablen vmin
und vmax
in imshow
anzugeben. Alternativ können Sie eine matplotlib.cm.Colormap
-Instanz erstellen und angeben. Dies ist jedoch komplizierter als in einfachen Fällen erforderlich.
Hier ist ein kurzes Beispiel mit einer einzelnen Farbleiste für alle Bilder:
import numpy as np
import matplotlib.pyplot as plt
# Generate some data that where each slice has a different range
# (The overall range is from 0 to 2)
data = np.random.random((4,10,10))
data *= np.array([0.5, 1.0, 1.5, 2.0])[:,None,None]
# Plot each slice as an independent subplot
fig, axes = plt.subplots(nrows=2, ncols=2)
for dat, ax in Zip(data, axes.flat):
# The vmin and vmax arguments specify the color limits
im = ax.imshow(dat, vmin=0, vmax=2)
# Make an axis for the colorbar on the right side
cax = fig.add_axes([0.9, 0.1, 0.03, 0.8])
fig.colorbar(im, cax=cax)
plt.show()
Die einfachste Lösung besteht darin, clim (lower_limit, upper_limit) mit den gleichen Argumenten für jedes Diagramm aufzurufen.
Dies beantwortet nur die Hälfte der Frage bzw. beginnt eine neue Frage ... Wenn Sie sich ändern
data *= np.array([0.5, 1.0, 1.5, 2.0])[:,None,None]
zu
data *= np.array([2.0, 1.0, 1.5, 0.5])[:,None,None]
ihr Farbbalken geht von 0 bis 0,5, was in diesem Fall dunkelblau bis etwas helleres Blau ist, und deckt nicht den gesamten Bereich (0 bis 2) ab .. _ Der Farbbalken zeigt nur die Farben des letzten Bildes oder der letzten Kontur an vmin
und vmax
.
Ich war nicht zufrieden mit den Lösungen, die vorschlugen, vmin
und vmax
manuell einzustellen, also entschloss ich mich, die Grenzen jedes Plots zu lesen und automatisch vmin
und vmax
einzustellen.
Das folgende Beispiel zeigt drei Diagramme von Proben, die aus Normalverteilungen mit steigendem Mittelwert entnommen wurden.
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import ImageGrid
import numpy as np
numberOfPlots = 3
data = []
for i in range(numberOfPlots):
mean = i
data.append(np.random.normal(mean, size=(100,100)))
fig = plt.figure()
grid = ImageGrid(fig, 111, nrows_ncols=(1,numberOfPlots), cbar_mode='single')
ims = []
for i in range(numberOfPlots):
ims.append(grid[i].imshow(data[i]))
grid[i].set_title("Mean = " + str(i))
clims = [im.get_clim() for im in ims]
vmin = min([clim[0] for clim in clims])
vmax = max([clim[1] for clim in clims])
for im in ims:
im.set_clim(vmin=np.floor(vmin),vmax=np.ceil(vmax))
grid[0].cax.colorbar(ims[0]) # with cbar_mode="single", cax attribute of all axes are identical
fig.show()