2015 die Wall Avenue Journal (WSJ) veröffentlichte eine hochwirksame Reihe von Heatmaps, die die Auswirkungen von Impfstoffen auf Infektionskrankheiten in den USA veranschaulichen. Diese Visualisierungen zeigten die Leistung von Deckenrichtlinien, um eine weit verbreitete Veränderung voranzutreiben. Sie können die Heatmaps anzeigen Hier.

Heatmaps sind ein vielseitiges Instrument für die Datenanalyse. Ihre Fähigkeit, vergleichende Analysen zu erleichtern, zeitliche Tendencies hervorzuheben und die Mustererkennung zu ermöglichen, macht sie für die Kommunikation komplexer Informationen von unschätzbarem Wert.

In diesem Schnellerfolgsdatenwissenschaft Projekt, wir werden verwenden Python’s Matplotlib -Grafikbibliothek, um die neu zu erstellen WSJs Maserndiagramm, der demonstriert, wie Sie Heatmaps und sorgfältig gestaltete Farbbars nutzen können, um das Erzählen von Daten zu beeinflussen.

Die Daten

Die Krankheitsdaten stammen von der Universität von Pittsburgh’s Projekt Tycho. Diese Organisation arbeitet mit nationalen und globalen Gesundheitsinstituten und Forschern zusammen, um Daten zur Verbesserung der globalen Gesundheit zu erleichtern. Die Maserndaten sind im Rahmen einer Inventive Commons Attribution 4.0 Worldwide Public verfügbar Lizenz.

Zur Einfachheit habe ich die Daten von Mission Tycho’s heruntergeladen Datenportal zu einer CSV -Datei und speicherte sie darin Kern. Später werden wir über den Code programmatisch darauf zugreifen.

Die Masern -Hitzemap

Wir werden die Funktion matplotlib pcolorMesh () verwenden, um ein enges Faksimile der zu konstruieren WSJ Masern Heatmap. Während andere Bibliotheken wie z. SeebornAnwesend Plotly SpecificUnd hvplotenthalten dedizierte Wärmefunktionen, die für diese gebaut wurden Benutzerfreundlichkeitmit den meisten Entwurfsentscheidungen abstrahiert. Dies macht es schwierig, ihre Ergebnisse zu erzwingen, um dem übereinzustimmen WSJ Heatmap.

Außerdem pcolormesh()Matplotlibs imshow() Funktion (für „Bildshow“) kann auch Wärme erzeugen. Der pcolormesh Die Funktion richtet jedoch besser die Gitterlinien mit Zellkanten aus.

Hier ist ein Beispiel für eine Heatmap mit imshow() dass Sie mit dem vergleichen pcolormesh() Ergebnisse später. Der Hauptunterschied ist der Mangel an Gitterlinien.

Masern Inzidenz Heatmap mit Matplotlibs gebaut imshow()Funktion (vom Autor)

1963 wurde der Masernimpfstoff lizenziert und in ganz Amerika mit weit verbreiteter Aufnahme freigelassen. Innerhalb von fünf Jahren wurde die Inzidenz der Krankheit stark verringert. Bis 2000 wurden in den USA Masern als ausgerottet angesehen, wobei alle neuen Fälle von außerhalb des Landes ankamen. Beachten Sie, wie intestine die Visualisierung dieses „Gesamtbild“ vermittelt und gleichzeitig die Particulars auf staatlicher Ebene erhalten. Dies ist nicht zuletzt auf die Auswahl der Farbbar zurückzuführen.

Die in der Visualisierung verwendeten Farben sind voreingenommen. Mehr als 80% der Farbleiste bestehen aus warmen Farben, und (helles) Blau ist für die kleinsten Werte reserviert. Dies erleichtert die Abgrenzung der Zeiträume vor und nach dem Rätsel. Weiße Zellen bezeichnen fehlende Datendargestellt durch NAN -Werte (nicht eine Zahl).

Vergleichen Sie die vorherige Heatmap mit einer mit einer ausgewogeneren Farbleiste:

Heatmap
Die Heatmap unter Verwendung einer ausgewogeneren Farbleiste (vom Autor)

Die dunklere blaue Farbe überwältigt nicht nur die Handlung, sie ist auch schwer für die Augen. Und obwohl es immer noch möglich ist, die Wirkung des Impfstoffs zu erkennen, ist die visuelle Wirkung weitaus subtiler als in der Handlung mit der voreingenommenen Farbleiste. Alternativ ist es einfacher, höhere Werte zu analysieren, aber auf Kosten des Gesamtthemas.

Der Code

Der folgende Code wurde in JupyterLab geschrieben und wird von Cell präsentiert.

Bibliotheken importieren

Die erste Zelle importiert die Bibliotheken, die wir das Projekt abschließen müssen. Eine On-line -Suche nach den Bibliotheksnamen führt Sie zu den Installationsanweisungen.

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colours import LinearSegmentedColormap, Normalize
from matplotlib.cm import ScalarMappable
import pandas as pd

Erstellen des benutzerdefinierten Colormap

Der folgende Code reproduziert den von der verwendeten Colormap genau WSJ. Ich habe das On-line verwendet Bildfarbauswahler Werkzeug, um die Schlüsselfarben aus einem Screenshot ihrer Masern -Heatmap zu identifizieren und diese basierend auf Farben anzupassen, die für a ausgewählt wurden Ähnliches Tutorial gebaut für R.

# Normalize RGB colours:
colours = ('#e7f0fa',  # lightest blue
          '#c9e2f6',  # gentle blue
          '#95cbee',  # blue
          '#0099dc',  # darkish blue
          '#4ab04a',  # inexperienced
          '#ffd73e',  # yellow
          '#eec73a',  # yellow brown
          '#e29421',  # darkish tan
          '#f05336',  # orange
          '#ce472e')  # pink

# Create a listing of positions for every coloration within the colormap:
positions = (0, 0.02, 0.03, 0.09, 0.1, 0.15, 0.25, 0.4, 0.5, 1)

# Create a LinearSegmentedColormap (steady colours):
custom_cmap = LinearSegmentedColormap.from_list('custom_colormap', 
                                                record(zip(positions, 
                                                         colours)))

# Show a colorbar with the customized colormap:
fig, ax = plt.subplots(figsize=(6, 1))

plt.imshow((record(vary(256))),
           cmap=custom_cmap, 
           facet='auto', 
           vmin=0, vmax=255)

plt.xticks(()), plt.yticks(())
plt.present()

Hier ist die generische Farbleiste, die durch den Code erzeugt wird:

Die Farbleiste basierend auf der WSJ Masern Heatmap (vom Autor)

Dieser Code macht a kontinuierlich Colormap unter Verwendung von Matplotlibs LinearSegmentedColormap() Klasse. Diese Klasse gibt Colormaps an, die verwendet werden Ankerpunkte zwischen denen die RGB (A) -Werte interpoliert sind. Das heißt, es erzeugt Colormap -Objekte basierend auf Suchtabellen mit linearen Segmenten. Es erstellt die Nachschlagtabelle unter Verwendung einer linearen Interpolation für jede Primärfarbe, wobei die 0–1 -Domäne in eine beliebige Anzahl von Segmenten unterteilt ist. Weitere Informationen finden Sie in diesem Kurzes Tutorial Bei der Herstellung kundenspezifischer Colormaps mit Matplotlib.

Laden und Vorbereiten der Krankheitsdaten

Als nächstes laden wir die CSV -Datei in Pandas und bereiten sie auf das Planen vor. Diese Datei enthält die Inzidenz von Masern (Wie die Anzahl der Fälle professional 100.000 Menschen) für jeden Staat (und der Distrikt Columbia) zu Woche Von 1928 bis 2003. Wir müssen die Werte in einen numerischen Datentyp konvertieren, die Daten nach Jahr aggregieren und den Datenrahmen für die Darstellung neu formen.

# Learn the csv file right into a DataFrame:
url = 'https://bit.ly/3F47ejX'
df_raw = pd.read_csv(url)

# Convert to numeric and mixture by yr:
df_raw.iloc(:, 2:) = (df_raw.iloc(:, 2:)
                      .apply(pd.to_numeric, 
                             errors='coerce'))

df = (df_raw.groupby('YEAR', as_index=False)
        .sum(min_count=1, numeric_only=True)
        .drop(columns=('WEEK')))

# Reshape the info for plotting:
df_melted = df.soften(id_vars='YEAR',
                    var_name='State',
                    value_name='Incidence')

df_pivot = df_melted.pivot_table(index='State',
                                 columns='YEAR',
                                 values='Incidence')

# Reverse the state order for plotting:
df_pivot = df_pivot(::-1)

So sieht der anfängliche (RAW-) Datenrahmen aus und zeigt die ersten fünf Zeilen und zehn Spalten:

Teil des Kopfes des Kopfes df_raw DataFrame (vom Autor)

NaN Die Werte werden durch einen Sprint (-) dargestellt.

Das Finale df_pivot DataFrame ist in breites Formatwobei jede Spalte eine Variable darstellt und Zeilen einzigartige Entitäten darstellen:

Teil des Kopfes des Kopfes dv_pivot DataFrame (vom Autor)

Während des Diagramms wird im Allgemeinen mit Verwendung durchgeführt langes Format Daten, wie in der df_raw Datenrahmen, pcolormesh() bevorzugt ein breites Format bei der Herstellung von Wärme. Dies liegt daran, dass Heatmaps von Natur aus so konzipiert sind, dass eine 2D-Matrix-ähnliche Struktur angezeigt wird, in der Zeilen und Spalten unterschiedliche Kategorien darstellen. In diesem Fall wird das endgültige Diagramm dem DataFrame ähnelt, mit Zuständen entlang der Y-Achse und Jahren entlang der X-Achse. Jede Zelle der Wärme wird basierend auf den numerischen Werten gefärbt.

Umgang mit fehlenden Werten

Der Datensatz enthält viele fehlende Werte. Wir werden diese von 0 Werten in der Heatmap unterscheiden, indem wir a machen Maske diese zu identifizieren und zu speichern NaN Werte. Bevor wir diese Maske mit Numpy anwenden, verwenden wir Matplotlibs Normalize() Klasse zu normalisieren die Daten. Auf diese Weise können wir die Heatmap -Farben direkt über Staaten vergleichen.

# Create a masks for NaN values:
nan_mask = df_pivot.isna()

# Normalize the info for a shared colormap:
norm = Normalize(df_pivot.min().min(), df_pivot.max().max())

# Apply normalization earlier than masking:
normalized_data = norm(df_pivot)

# Create masked array from normalized knowledge:
masked_data = np.ma.masked_array(normalized_data, masks=nan_mask)

Die Heatmap aufweisen

Der folgende Code erstellt die Heatmap. Das Herz davon besteht aus der einzelnen Zeile, die das nennt pcolormesh() Funktion. Der größte Teil der Relaxation verschönert die Handlung so, dass sie wie das aussieht WSJ Heatmap (mit Ausnahme der X-, Y- und Colorbar -Etiketten, die in unserer Model erheblich verbessert sind).

# Plot the info utilizing pcolormesh with a masked array:
multiplier = 0.22  # Adjustments determine facet ratio
fig, ax = plt.subplots(figsize=(11, len(df_pivot.index) * multiplier))

states = df_pivot.index
years = df_pivot.columns

im = plt.pcolormesh(masked_data, cmap=custom_cmap, 
                    edgecolors='w', linewidth=0.5)

ax.set_title('Measles Incidence by State (1928-2002)', fontsize=16)

# Regulate x-axis ticks and labels to be centered:
every_other_year_indices = np.arange(0, len(years), 2) + 0.5
ax.set_xticks(every_other_year_indices)
ax.set_xticklabels(years(::2), rotation='vertical', fontsize=10)

# Regulate labels on y-axis:
ax.set_yticks(np.arange(len(states)) + 0.5)  # Heart ticks in cells
ax.set_yticklabels(states, fontsize=9)

# Add vertical line and label for vaccine date:
vaccine_year_index = record(years).index(1963)
ax.axvline(x=vaccine_year_index, linestyle='--', 
           linewidth=1, coloration='ok')
alaska_index = states.get_loc('ALASKA')
ax.textual content(vaccine_year_index, alaska_index, ' Vaccine', 
        ha='left', va='heart', fontweight='daring')

# Add a colorbar:
cbar = fig.colorbar(ScalarMappable(norm=norm, cmap=custom_cmap), 
                    ax=ax, orientation='horizontal', pad=0.1, 
                    label='Instances per 100,000')
cbar.ax.xaxis.set_ticks_position('backside')

plt.savefig('measles_pcolormesh_nan.png', dpi=600, bbox_inches='tight')
plt.present()

Hier ist das Ergebnis:

Masern Inzidenz Heatmap mit Matplotlibs gebaut pcolormesh() Funktion (vom Autor)

Dies ist eine enge Annäherung der WSJ Heatmapmit dem, was ich als lesbarere Etiketten betrachte und eine bessere Trennung von 0 und eine bessere Trennung NaN (fehlende Daten) Werte.

Verwendet für Wärmemaps

Heatmaps sind sehr effektiv, um zu zeigen, wie sich eine pauschale Richtlinie oder Aktion im Laufe der Zeit auf mehrere geografische Regionen auswirkt. Dank ihrer Vielseitigkeit können sie für andere Zwecke angepasst werden, z. B. die Verfolgung:

  • Luftqualitätsindexspiegel in verschiedenen Städten vor und nach dem Clear Air Act
  • Änderung der Testergebnisse für Schulen oder Distrikte nach Richtlinien wie Kein Type zurückgelassen
  • Arbeitslosenquoten für verschiedene Regionen nach wirtschaftlichen Anregungspaketen
  • Produktverkaufsleistung nach Area nach lokalen oder landesweiten Werbekampagnen

Zu den Vorteilen von Heatmaps gehört, dass sie mehrere Analysetechniken fördern. Dazu gehören:

Vergleichende Analyse: Vergleichen Sie die Tendencies in verschiedenen Kategorien (Staaten, Schulen, Regionen usw.) leicht.

Zeitliche Tendencies: Zeigen Sie elegant, wie sich die Werte im Laufe der Zeit ändern.

Mustererkennung: Identifizieren Sie Muster und Anomalien in den Daten auf einen Blick.

Kommunikation: Bieten Sie eine klare und präzise Möglichkeit, komplexe Daten zu kommunizieren.

Heatmaps sind eine großartige Möglichkeit, einen Überblick über ein großes Bild zu geben und gleichzeitig die feine Granularität der Daten zu erhalten.

Von admin

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert