webentwicklung-frage-antwort-db.com.de

Wie kann ich eine Standardfarbleiste für eine Reihe von Darstellungen in Python erstellen

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.

37
user1010845

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

enter image description here

72
Joe Kington

Die einfachste Lösung besteht darin, clim (lower_limit, upper_limit) mit den gleichen Argumenten für jedes Diagramm aufzurufen.

9
Christian Alis

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.

2
robert

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

 enter image description here

0
toliveira