Bild auf Matplotlib-Diagramm überlagern

MatplotlibMatplotlibBeginner
Jetzt üben

This tutorial is from open-source community. Access the source code

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

Bei der Datenvisualisierung möchten Sie möglicherweise manchmal ein Logo, ein Wasserzeichen oder andere Bilderlemente zu Ihren Diagrammen hinzufügen. In diesem Tutorial wird gezeigt, wie Sie ein Bild auf einem Matplotlib-Diagramm platzieren, indem Sie es vor dem Diagramminhalt positionieren und es halbtransparent machen.

Sie werden lernen, wie Sie die Methode figimage aus der Klasse matplotlib.figure.Figure verwenden, um ein Bild auf Ihrem Diagramm zu positionieren, und die Methode imread aus dem Modul matplotlib.image, um Bilddaten zu laden.

Am Ende dieses Tutorials können Sie professionell aussehende Visualisierungen mit benutzerdefinierten Bildüberlagerungen erstellen, die für Markenbildung, Wasserzeichen oder zur Verbesserung des visuellen Eindrucks Ihrer Datenpräsentationen nützlich sein können.

Tipps zur virtuellen Maschine (VM)

Nachdem die VM gestartet wurde, klicken Sie in der oberen linken Ecke auf die Registerkarte Notebook, um auf Jupyter Notebook zuzugreifen und zu üben.

click-notebook
Manchmal müssen Sie möglicherweise einige Sekunden warten, bis Jupyter Notebook vollständig geladen ist. Aufgrund von Einschränkungen in Jupyter Notebook kann die Überprüfung von Vorgängen nicht automatisiert werden.

Wenn Sie während des Lernens Probleme haben, können Sie sich gerne an Labby wenden. Geben Sie nach der Sitzung Feedback ab, und wir werden das Problem umgehend für Sie beheben.

Erstellen eines Jupyter Notebooks und Importieren der erforderlichen Bibliotheken

Geben Sie in der ersten Zelle Ihres Notebooks den folgenden Code ein, um die erforderlichen Bibliotheken zu importieren:

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.cbook as cbook
import matplotlib.image as image

Lassen Sie uns verstehen, was jede dieser Bibliotheken tut:

  • matplotlib.pyplot (Alias plt): Eine Sammlung von Funktionen, die matplotlib wie MATLAB funktionieren lassen und eine bequeme Schnittstelle zum Erstellen von Diagrammen bieten.
  • numpy (Alias np): Ein grundlegendes Paket für wissenschaftliche Berechnungen in Python, das wir zur Datenmanipulation verwenden werden.
  • matplotlib.cbook: Eine Sammlung von Hilfsfunktionen für matplotlib, einschließlich Funktionen zum Abrufen von Beispieldaten.
  • matplotlib.image: Ein Modul für bildbezogene Funktionen in matplotlib, das wir zum Lesen und Anzeigen von Bildern verwenden werden.

Führen Sie die Zelle aus, indem Sie auf die Schaltfläche "Run" oben im Notebook klicken oder Shift+Enter drücken.

libraries-imported

Die Ausführung dieser Zelle sollte ohne Ausgabe abgeschlossen werden, was darauf hinweist, dass alle Bibliotheken erfolgreich importiert wurden.

Laden und Untersuchen des Bildes

Nachdem wir unsere Bibliotheken importiert haben, müssen wir das Bild laden, das wir auf unserem Diagramm überlagern möchten. Matplotlib bietet einige Beispielbilder, die wir zum Üben verwenden können.

  1. Erstellen Sie eine neue Zelle in Ihrem Notebook und geben Sie den folgenden Code ein:
## Load the sample image
with cbook.get_sample_data('logo2.png') as file:
    im = image.imread(file)

## Display information about the image
print(f"Image shape: {im.shape}")
print(f"Image data type: {im.dtype}")

## Display the image
plt.figure(figsize=(4, 4))
plt.imshow(im)
plt.axis('off')  ## Hide axis
plt.title('Matplotlib Logo')
plt.show()

Dieser Code macht Folgendes:

  • Nutzt cbook.get_sample_data(), um ein Beispielbild namens 'logo2.png' aus der Beispiel-Datensammlung von Matplotlib zu laden.
  • Nutzt image.imread(), um die Bilddatei in ein NumPy-Array einzulesen.
  • Gibt Informationen über die Bilddimensionen und den Datentyp aus.
  • Erstellt eine Abbildung und zeigt das Bild mit plt.imshow() an.
  • Blendet die Achsenmarkierungen und -beschriftungen mit plt.axis('off') aus.
  • Fügt der Abbildung einen Titel hinzu.
  • Zeigt die Abbildung mit plt.show() an.
  1. Führen Sie die Zelle aus, indem Sie Shift+Enter drücken.

Die Ausgabe sollte Informationen über das Bild anzeigen und das Matplotlib-Logo zeigen. Die Bildform gibt die Dimensionen des Bildes an (Höhe, Breite, Farbkanäle), und der Datentyp sagt uns, wie die Bilddaten gespeichert sind.

image-info

Dieser Schritt ist wichtig, da er uns hilft, das Bild zu verstehen, das wir als Überlagerung verwenden werden. Wir können sein Aussehen und seine Dimensionen sehen, was nützlich sein wird, wenn wir entscheiden, wie wir es auf unserem Diagramm positionieren möchten.

Erstellen eines einfachen Diagramms mit Zufallsdaten

Bevor wir unser Bild als Überlagerung hinzufügen, müssen wir ein Diagramm erstellen, das als Grundlage für unsere Visualisierung dient. Erstellen wir ein einfaches Balkendiagramm mit Zufallsdaten.

  1. Erstellen Sie eine neue Zelle in Ihrem Notebook und geben Sie den folgenden Code ein:
## Create a figure and axes for our plot
fig, ax = plt.subplots(figsize=(10, 6))

## Set a random seed for reproducibility
np.random.seed(19680801)

## Generate random data
x = np.arange(30)  ## x-axis values (0 to 29)
y = x + np.random.randn(30)  ## y-axis values (x plus random noise)

## Create a bar chart
bars = ax.bar(x, y, color='#6bbc6b')  ## Green bars

## Add grid lines
ax.grid(linestyle='--', alpha=0.7)

## Add labels and title
ax.set_xlabel('X-axis Label')
ax.set_ylabel('Y-axis Label')
ax.set_title('Bar Chart with Random Data')

## Display the plot
plt.tight_layout()
plt.show()

Dieser Code macht Folgendes:

  • Erstellt eine Abbildung und Achsen mit einer bestimmten Größe mithilfe von plt.subplots().
  • Setzt einen Zufallssaatwert, um sicherzustellen, dass wir jedes Mal die gleichen Zufallswerte erhalten, wenn wir den Code ausführen.
  • Generiert 30 x-Werte (von 0 bis 29) und entsprechende y-Werte (x plus Zufallsrauschen).
  • Erstellt ein Balkendiagramm mit grünen Balken mithilfe von ax.bar().
  • Fügt Gitterlinien zum Diagramm mit ax.grid() hinzu.
  • Fügt Beschriftungen für die x-Achse, y-Achse und einen Titel für das Diagramm hinzu.
  • Nutzt plt.tight_layout(), um den Abstand für ein besseres Erscheinungsbild anzupassen.
  • Zeigt das Diagramm mit plt.show() an.
  1. Führen Sie die Zelle aus, indem Sie Shift+Enter drücken.

Die Ausgabe sollte ein Balkendiagramm mit grünen Balken anzeigen, die die Zufallsdaten repräsentieren. Die x-Achse zeigt ganze Zahlen von 0 bis 29, und die y-Achse zeigt die entsprechenden Werte mit hinzugefügtem Zufallsrauschen.

Dieses Diagramm wird die Grundlage sein, auf der wir in einem nächsten Schritt unser Bild überlagern werden. Beachten Sie, wie wir das Abbildungsobjekt in der Variablen fig und das Achsenobjekt in der Variablen ax gespeichert haben. Wir werden diese Variablen benötigen, um unser Bild als Überlagerung hinzuzufügen.

Überlagern des Bildes auf dem Diagramm

Nachdem wir unser Basisdiagramm erstellt haben, überlagern wir nun das Bild darauf. Wir verwenden die Methode figimage, um das Bild der Abbildung hinzuzufügen, und machen es halbtransparent, damit das darunter liegende Diagramm weiterhin sichtbar bleibt.

  1. Erstellen Sie eine neue Zelle in Ihrem Notebook und geben Sie den folgenden Code ein:
## Create a figure and axes for our plot (same as before)
fig, ax = plt.subplots(figsize=(10, 6))

## Set a random seed for reproducibility
np.random.seed(19680801)

## Generate random data
x = np.arange(30)  ## x-axis values (0 to 29)
y = x + np.random.randn(30)  ## y-axis values (x plus random noise)

## Create a bar chart
bars = ax.bar(x, y, color='#6bbc6b')  ## Green bars

## Add grid lines
ax.grid(linestyle='--', alpha=0.7)

## Add labels and title
ax.set_xlabel('X-axis Label')
ax.set_ylabel('Y-axis Label')
ax.set_title('Bar Chart with Image Overlay')

## Load the image
with cbook.get_sample_data('logo2.png') as file:
    im = image.imread(file)

## Overlay the image on the plot
## Parameters:
## - im: the image data
## - 25, 25: x and y position in pixels from the bottom left
## - zorder=3: controls the drawing order (higher numbers are drawn on top)
## - alpha=0.5: controls the transparency (0 = transparent, 1 = opaque)
fig.figimage(im, 25, 25, zorder=3, alpha=0.5)

## Display the plot
plt.tight_layout()
plt.show()

Dieser Code kombiniert das, was wir in den vorherigen Schritten getan haben, und fügt die figimage-Methode hinzu, um unser Bild auf dem Diagramm zu überlagern. Hier ist eine Aufschlüsselung der figimage-Parameter:

  • im: Die Bilddaten als NumPy-Array.
  • 25, 25: Die x- und y-Positionen in Pixeln vom unteren linken Eck der Abbildung aus.
  • zorder=3: Steuert die Zeichnungsreihenfolge. Höhere Zahlen werden über Elementen mit niedrigeren Zahlen gezeichnet.
  • alpha=0.5: Steuert die Transparenz des Bildes. Ein Wert von 0 ist vollständig transparent, und 1 ist vollständig undurchsichtig.
  1. Führen Sie die Zelle aus, indem Sie Shift+Enter drücken.

Die Ausgabe sollte dasselbe Balkendiagramm wie zuvor zeigen, aber nun mit dem Matplotlib-Logo, das in der unteren linken Ecke überlagert ist. Das Logo sollte halbtransparent sein, sodass das darunter liegende Diagramm weiterhin sichtbar bleibt.

  1. Experimentieren wir mit verschiedenen Positionen und Transparenzgraden. Erstellen Sie eine neue Zelle und geben Sie den folgenden Code ein:
## Create a figure and axes for our plot
fig, ax = plt.subplots(figsize=(10, 6))

## Set a random seed for reproducibility
np.random.seed(19680801)

## Generate random data
x = np.arange(30)
y = x + np.random.randn(30)

## Create a bar chart
bars = ax.bar(x, y, color='#6bbc6b')
ax.grid(linestyle='--', alpha=0.7)
ax.set_xlabel('X-axis Label')
ax.set_ylabel('Y-axis Label')
ax.set_title('Bar Chart with Centered Image Overlay')

## Load the image
with cbook.get_sample_data('logo2.png') as file:
    im = image.imread(file)

## Get figure dimensions
fig_width, fig_height = fig.get_size_inches() * fig.dpi

## Calculate center position (this is approximate)
x_center = fig_width / 2 - im.shape[1] / 2
y_center = fig_height / 2 - im.shape[0] / 2

## Overlay the image at the center with higher transparency
fig.figimage(im, x_center, y_center, zorder=3, alpha=0.3)

## Display the plot
plt.tight_layout()
plt.show()

Dieser Code platziert das Bild in der Mitte der Abbildung mit einem höheren Transparenzgrad (alpha = 0,3), wodurch es besser als Wasserzeichen geeignet ist.

  1. Führen Sie die Zelle aus, indem Sie Shift+Enter drücken.

Die Ausgabe sollte das Balkendiagramm mit dem zentrierten und transparenteren Logo als zuvor zeigen, wodurch ein Wasserzeicheneffekt entsteht.

Erstellen einer wiederverwendbaren Funktion für Bildüberlagerungen

Um unseren Code wiederverwendbarer zu machen, erstellen wir eine Funktion, die ein Bild als Überlagerung zu jeder Matplotlib-Abbildung hinzufügen kann. So können wir denselben Effekt einfach auf verschiedene Diagramme anwenden.

  1. Erstellen Sie eine neue Zelle in Ihrem Notebook und geben Sie den folgenden Code ein:
def add_image_overlay(fig, image_path, x_pos=25, y_pos=25, alpha=0.5, zorder=3):
    """
    Add an image overlay to a matplotlib figure.

    Parameters:
    -----------
    fig : matplotlib.figure.Figure
        The figure to add the image to
    image_path : str
        Path to the image file
    x_pos : int
        X position in pixels from the bottom left
    y_pos : int
        Y position in pixels from the bottom left
    alpha : float
        Transparency level (0 to 1)
    zorder : int
        Drawing order (higher numbers are drawn on top)

    Returns:
    --------
    fig : matplotlib.figure.Figure
        The figure with the image overlay
    """
    ## Load the image
    with cbook.get_sample_data(image_path) as file:
        im = image.imread(file)

    ## Add the image to the figure
    fig.figimage(im, x_pos, y_pos, zorder=zorder, alpha=alpha)

    return fig

## Example usage: Create a scatter plot with an image overlay
fig, ax = plt.subplots(figsize=(10, 6))

## Set a random seed for reproducibility
np.random.seed(19680801)

## Generate random data for a scatter plot
x = np.random.rand(50) * 10
y = np.random.rand(50) * 10

## Create a scatter plot
ax.scatter(x, y, s=100, c=np.random.rand(50), cmap='viridis', alpha=0.7)
ax.grid(linestyle='--', alpha=0.7)
ax.set_xlabel('X-axis Label')
ax.set_ylabel('Y-axis Label')
ax.set_title('Scatter Plot with Image Overlay')

## Add the image overlay using our function
add_image_overlay(fig, 'logo2.png', x_pos=50, y_pos=50, alpha=0.4)

## Display the plot
plt.tight_layout()
plt.show()

Dieser Code definiert eine Funktion namens add_image_overlay, die:

  • Parameter für die Abbildung, den Bildpfad, die Position, die Transparenz und die Zeichnungsreihenfolge (z-order) akzeptiert.
  • Das angegebene Bild lädt.
  • Das Bild mithilfe von figimage zur Abbildung hinzufügt.
  • Die modifizierte Abbildung zurückgibt.

Nachdem die Funktion definiert wurde, demonstrieren wir ihre Verwendung, indem wir ein Streudiagramm mit Zufallsdaten erstellen und das Matplotlib-Logo als Überlagerung hinzufügen.

  1. Führen Sie die Zelle aus, indem Sie Shift+Enter drücken.

Die Ausgabe sollte ein Streudiagramm mit zufällig positionierten und farbigen Punkten zeigen, sowie das Matplotlib-Logo, das an Position (50, 50) mit 40 % Opazität überlagert ist.

  1. Versuchen wir noch ein Beispiel mit einem Linien Diagramm. Erstellen Sie eine neue Zelle und geben Sie den folgenden Code ein:
## Example usage: Create a line plot with an image overlay
fig, ax = plt.subplots(figsize=(10, 6))

## Generate data for a line plot
x = np.linspace(0, 10, 100)
y = np.sin(x)

## Create a line plot
ax.plot(x, y, linewidth=2, color='#d62728')
ax.grid(linestyle='--', alpha=0.7)
ax.set_xlabel('X-axis Label')
ax.set_ylabel('Y-axis Label')
ax.set_title('Sine Wave with Image Overlay')
ax.set_ylim(-1.5, 1.5)

## Add the image overlay using our function
## Place it in the bottom right corner
fig_width, fig_height = fig.get_size_inches() * fig.dpi
with cbook.get_sample_data('logo2.png') as file:
    im = image.imread(file)
    x_pos = fig_width - im.shape[1] - 50  ## 50 pixels from the right edge

add_image_overlay(fig, 'logo2.png', x_pos=x_pos, y_pos=50, alpha=0.6)

## Display the plot
plt.tight_layout()
plt.show()

Dieser Code erstellt ein Linien Diagramm, das eine Sinuswelle zeigt, und fügt das Matplotlib-Logo in die untere rechte Ecke des Diagramms ein.

  1. Führen Sie die Zelle aus, indem Sie Shift+Enter drücken.

Die Ausgabe sollte ein Linien Diagramm einer Sinuswelle zeigen, mit dem Matplotlib-Logo, das in der unteren rechten Ecke mit 60 % Opazität überlagert ist.

Diese Beispiele zeigen, wie unsere add_image_overlay-Funktion verwendet werden kann, um einfach Bildüberlagerungen zu verschiedenen Diagrammtypen hinzuzufügen, was sie zu einem vielseitigen Werkzeug zur Anpassung von Visualisierungen macht.

Zusammenfassung

In diesem Tutorial haben Sie gelernt, wie Sie Bilder auf Matplotlib-Diagrammen überlagern können, um Wasserzeichen, Logos oder andere visuelle Elemente zu erstellen, die Ihre Visualisierungen verbessern. Hier ist eine Zusammenfassung dessen, was wir behandelt haben:

  1. Importieren von Bibliotheken: Wir haben begonnen, indem wir die erforderlichen Bibliotheken für die Arbeit mit Matplotlib-Diagrammen und Bildern importiert haben.

  2. Laden und Untersuchen von Bildern: Wir haben gelernt, wie man Bilder mit der Funktion imread lädt und wie man deren Eigenschaften untersucht.

  3. Erstellen von Basisdiagrammen: Wir haben verschiedene Diagrammtypen (Balkendiagramme, Streudiagramme und Linien Diagramme) erstellt, die als Grundlage für unsere Bildüberlagerungen dienen.

  4. Überlagern von Bildern: Wir haben die Methode figimage verwendet, um Bilder auf unseren Diagrammen zu platzieren und deren Position, Transparenz und Zeichnungsreihenfolge zu steuern.

  5. Erstellen einer wiederverwendbaren Funktion: Wir haben eine wiederverwendbare Funktion entwickelt, um es einfacher zu machen, Bildüberlagerungen zu jeder Matplotlib-Abbildung hinzuzufügen.

Die Fähigkeiten, die Sie in diesem Tutorial gelernt haben, können auf Folgendes angewendet werden:

  • Hinzufügen von Wasserzeichen zu Diagrammen zum Schutz des Urheberrechts
  • Einbeziehen von Logos für die Markenpräsenz in Visualisierungen
  • Erstellen von benutzerdefinierten Hintergrundelementen für ästhetisch ansprechende Diagramme
  • Kombinieren von Bildern mit Datenvisualisierungen für Präsentationen und Berichte

Sie können weiterhin mit verschiedenen Diagrammtypen, Bildern, Positionen und Transparenzgraden experimentieren, um einzigartige und professionell aussehende Visualisierungen zu erstellen, die Ihren spezifischen Anforderungen entsprechen.