Ich blieb bei etwas hängen, das sich relativ einfach anfühlt. Der Code, den ich unten bringe, ist ein Beispiel, das auf einem größeren Projekt basiert, an dem ich arbeite. Ich habe keinen Grund gesehen, alle Details zu veröffentlichen. Bitte akzeptieren Sie die Datenstrukturen, die ich mitbringe, so wie sie sind.
Grundsätzlich erstelle ich ein Balkendiagramm und kann nur herausfinden, wie Wertelabels zu den Balken hinzugefügt werden (in der Mitte des Balkens oder direkt darüber). Ich habe mir Beispiele im Internet angesehen, aber keinen Erfolg bei der Implementierung meines eigenen Codes. Ich glaube, die Lösung besteht entweder aus 'Text' oder 'Annotate', aber ich: a) weiß nicht, welche ich verwenden soll (und im Allgemeinen habe ich nicht herausgefunden, wann ich welche verwenden soll). b) kann nicht sehen, um die Wertelabels zu präsentieren. Würde mich über Ihre Hilfe freuen, mein Code unten. Danke im Voraus!
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
pd.set_option('display.mpl_style', 'default')
%matplotlib inline
# Bring some raw data.
frequencies = [6, 16, 75, 160, 244, 260, 145, 73, 16, 4, 1]
# In my original code I create a series and run on that,
# so for consistency I create a series from the list.
freq_series = pd.Series.from_array(frequencies)
x_labels = [108300.0, 110540.0, 112780.0, 115020.0, 117260.0, 119500.0,
121740.0, 123980.0, 126220.0, 128460.0, 130700.0]
# Plot the figure.
plt.figure(figsize=(12, 8))
fig = freq_series.plot(kind='bar')
fig.set_title('Amount Frequency')
fig.set_xlabel('Amount ($)')
fig.set_ylabel('Frequency')
fig.set_xticklabels(x_labels)
quelle
Antworten:
Gibt zunächst
freq_series.plot
eine Achse zurück, die keine Zahl ist. Um meine Antwort ein wenig klarer zu machen, habe ich Ihren angegebenen Code geändert, um darauf zu verweisen,ax
anstattfig
mit anderen Codebeispielen konsistenter zu sein.Sie können die Liste der im Plot erzeugten Balken vom
ax.patches
Mitglied erhalten. Anschließend können Sie die in diesemmatplotlib
Galeriebeispiel gezeigte Technik verwenden , um die Beschriftungen mithilfe derax.text
Methode hinzuzufügen .Dies erzeugt ein beschriftetes Diagramm, das wie folgt aussieht:
quelle
text
druckt einfach Text auf das Diagramm, währendannotate
es ein Hilfsmittel ist, mit dem Sie auf einfache Weise auch einen Pfeil aus dem Text hinzufügen können, der auf einen bestimmten Punkt im Diagramm zeigt, auf den sich der Text bezieht.Basierend auf einer in dieser Antwort auf eine andere Frage erwähnten Funktion habe ich eine sehr allgemein anwendbare Lösung zum Platzieren von Beschriftungen auf einem Balkendiagramm gefunden.
Andere Lösungen funktionieren leider in vielen Fällen nicht, da der Abstand zwischen Etikett und Balken entweder in absoluten Einheiten der Balken angegeben oder durch die Höhe des Balkens skaliert wird . Ersteres funktioniert nur für einen engen Wertebereich und letzteres ergibt einen inkonsistenten Abstand innerhalb eines Diagramms. Beides funktioniert nicht gut mit logarithmischen Achsen.
Die von mir vorgeschlagene Lösung funktioniert unabhängig von der Skalierung (dh für kleine und große Zahlen) und platziert sogar Beschriftungen für negative Werte und mit logarithmischen Skalierungen korrekt, da die visuelle Einheit
points
für Offsets verwendet wird.Ich habe eine negative Zahl hinzugefügt, um die korrekte Platzierung der Etiketten in einem solchen Fall anzuzeigen.
Der Wert der Höhe jedes Balkens wird als Beschriftung dafür verwendet. Andere Labels können problemlos mit Simons
for rect, label in zip(rects, labels)
Snippet verwendet werden .Bearbeiten: Ich habe die relevante Funktionalität in einer Funktion extrahiert, wie von Barnhillec vorgeschlagen .
Dies erzeugt die folgende Ausgabe:
Und mit der logarithmischen Skalierung (und einigen Anpassungen an den Eingabedaten, um die logarithmische Skalierung darzustellen) ist dies das Ergebnis:
quelle
Aufbauend auf der obigen (großartigen!) Antwort können wir mit nur wenigen Anpassungen auch ein horizontales Balkendiagramm erstellen:
quelle
freq_series.plot(kind='barh', grid=True)
Wenn Sie nur die Datenpunkte über der Leiste beschriften möchten, können Sie plt.annotate () verwenden.
Mein Code:
Nun, Text mit mehreren Zeichen wird möglicherweise etwas außermittig angezeigt. Dies kann jedoch überwunden werden, indem die x-Koordinate im xy-Parameter in Abhängigkeit von der Größe des Textes geringfügig verringert wird
quelle
Wenn Sie nur Datenpunkte über den Balken hinzufügen möchten, können Sie dies problemlos tun mit:
quelle