Matplotlib bar graph die x-Achse nicht plot-string-Werte
Mein name ist David und ich arbeite für einen Krankenwagen-service in Florida.
Ich bin mit Python 2.7 und matplotlib. Ich bin versucht zu erreichen, in meine Datenbank Krankenwagen ruft und zählen Sie die Anzahl der Anrufe, die passieren, an jedem Wochentag.
Werde ich dann verwenden matplotlib erstellen Sie ein Balkendiagramm, in der diese Informationen zu geben, die Sanitäter eine visuelle Grafik, wie beschäftigt Sie sind, an jedem Tag.
HIER IST CODE, DER FUNKTIONIERT SEHR GUT:
import pyodbc
import matplotlib.pyplot as plt
MySQLQuery = """
SELECT
DATEPART(WEEKDAY, IIU_tDispatch)AS [DayOfWeekOfCall]
COUNT(DATEPART(WeekDay, IIU_tDispatch)) AS [DispatchesOnThisWeekday]
FROM AmbulanceIncidents
GROUP BY DATEPART(WEEKDAY, IIU_tDispatch)
ORDER BY DATEPART(WEEKDAY, IIU_tDispatch)
"""
cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=MyServer;DATABASE=MyDatabase;UID=MyUserID;PWD=MyPassword')
cursor = cnxn.cursor()
GraphCursor = cnxn.cursor()
cursor.execute(MySQLQuery)
#generate a graph to display the data
data = GraphCursor.fetchall()
DayOfWeekOfCall, DispatchesOnThisWeekday = zip(*data)
plt.bar(DayOfWeekOfCall, DispatchesOnThisWeekday)
plt.grid()
plt.title('Dispatches by Day of Week')
plt.xlabel('Day of Week')
plt.ylabel('Number of Dispatches')
plt.show()
Den code oben funktioniert sehr gut. Es gibt eine schön anzuschauende Grafik und ich bin glücklich. Ich möchte nur eine änderung vornehmen.
Statt die X-Achse zeigt die Namen der Tage der Woche, wie "Sonntag", es zeigt die ganze Zahl. In anderen Worten, der Sonntag ist 1, Montag ist 2 usw..
Meine Lösung für dieses Problem ist, dass ich umschreiben, meine sql-Abfrage ein, mit der Funktion Datename() anstelle von DATEPART().
Unten ist mein sql-code, um den Namen der Woche (im Gegensatz zu Ganzzahl).
SELECT
DATENAME(WEEKDAY, IIU_tDispatch)AS [DayOfWeekOfCall]
, COUNT(DATENAME(WeekDay, IIU_tDispatch)) AS [DispatchesOnThisWeekday]
FROM AmbulanceIncidents
GROUP BY DATENAME(WEEKDAY, IIU_tDispatch)
ORDER BY DATENAME(WEEKDAY, IIU_tDispatch)
Alles andere in meinem python-code bleibt der gleiche. Allerdings funktioniert das nicht und ich kann nicht verstehen, die Fehlermeldungen.
Hier sind die Fehlermeldungen:
Traceback (most recent call last):
File "C:\Documents and Settings\kulpandm\workspace\FiscalYearEndReport\CallVolumeByDayOfWeek.py", line 59, in
<module>
plt.bar(DayOfWeekOfCall, DispatchesOnThisWeekday)
File "C:\Python27\lib\site-packages\matplotlib\pyplot.py", line 2080, in bar
ret = ax.bar(left, height, width, bottom, **kwargs)
File "C:\Python27\lib\site-packages\matplotlib\axes.py", line 4740, in bar
self.add_patch(r)
File "C:\Python27\lib\site-packages\matplotlib\axes.py", line 1471, in add_patch
self._update_patch_limits(p)
File "C:\Python27\lib\site-packages\matplotlib\axes.py", line 1489, in _update_patch_limits
xys = patch.get_patch_transform().transform(vertices)
File "C:\Python27\lib\site-packages\matplotlib\patches.py", line 547, in get_patch_transform
self._update_patch_transform()
File "C:\Python27\lib\site-packages\matplotlib\patches.py", line 543, in _update_patch_transform
bbox = transforms.Bbox.from_bounds(x, y, width, height)
File "C:\Python27\lib\site-packages\matplotlib\transforms.py", line 745, in from_bounds
return Bbox.from_extents(x0, y0, x0 + width, y0 + height)
TypeError: coercing to Unicode: need string or buffer, float found
Kann ich nicht herausfinden.
Zusammenfassend ist zu sagen, wenn ich die Ausgabe meiner Daten, die mit der x-Achse als Ganzzahlen, die Tage der Woche und die y-Achse zeigt die Anzahl von Krankenwagen Vorfälle, Matplotlib erzeugt eine schöne Grafik. Aber wenn meine Daten Ausgabe der x-Achse ist ein string (Sonntag, Montag usw.). dann Matplotlib wird nicht funktionieren.
Ich habe mehrere Stunden der Forschung bei Google und dem Lesen der matplotlib-Dokumentation.
Bitte helfen Sie mir mit diesem. Ich bin der Hoffnung, zu nutzen, Matplotlib, wie meine reports engine.
InformationsquelleAutor David Kulpanowski | 2012-02-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Deine Frage hat nichts zu tun mit einer SQL-Abfrage, es ist einfach ein Mittel zum Zweck. Was Sie wirklich Fragen ist, wie ändern Sie die Beschriftung in einem Balkendiagramm in pylab. Die docs für die bar chart sind nützlich für das anpassen, aber einfach ändern Sie die Etiketten hier ist ein minimal-Beispiel (MWE):
An dieser Stelle matplotlib ist so seltsam, dass ich vermute, dass niemand wirklich versteht, warum etwas passiert.
Zum Glück seaborn (obwohl gebaut auf matplotlib) scheint nicht dieses problem haben (stackoverflow.com/q/32528154/4900327).
Dies ist genau das Szenario, das ich suchte. Ich hatte ein array mit der Länge, mit 20 Saiten, und andere-array der gleichen Länge mit Ganzzahlen und war denken, um Beziehungen zwischen diesen mit int-array der y-Achse und die string-Arrays auf der x-Achse. Danke.
InformationsquelleAutor Hooked
Nicht ändern Sie Ihre SQL-code zu ändern der Abbildung. Stattdessen machen eine kleine Ergänzung zu deinem Python-code.
Ich glaube, Sie können etwas tun, wie diese Antwort. Legen Sie die Beschriftungen der hilfsstriche werden die Tage der Woche.
Es kann so einfach sein wie das hinzufügen der folgenden Zeile:
Dokumentation: pyplot.xticks
EDIT: Beispiel Antwort zu Kommentar über eine fiktive Tabelle
IncidentTypes
ordnet integer-Schlüssel mit den Namen der incident-Typen.Fortsetzung von früheren post. SPSS-und SAS-leicht erstellen Sie Balkendiagramme mit nominalen Werten. Ich habe eine harte Zeit zu glauben, dies ist so schwer für Matplotlib. Es muss etwas einfach, dass ich vermisst werde ! Aber was ist es ?
Re ersten Kommentar: Man könnte hinzufügen, eine SQL-Tabelle, die Karten zahlen Tage oder ganze zahlen für das incident-Typen. Beispiel:
create table IncidentTypes (pk int primary key auto_increment, Name varchar(20))
. Dann einfach verknüpfen der Tabellen. Dieser ist flexibel und modular aufgebaut. Sie können sich auf einen Vorfall geben Sie entweder durch die Taste (int) oder den Namen (in Python).Re zweite Bemerkung: das Hinzufügen der obigen Zeile ist nicht zu viel eines Streits. Wenn Sie sehen in diesem Beispiel in den docs, Sie tun die gleiche Sache. Die Bezeichnungen (das zweite argument), Sie konnte Lesen, Sie in Python, von der vorgeschlagenen SQL-Tabelle in meinem vorherigen Kommentar.
Danke sehr viel Steve. Sobald StackOverflow erlaubt mir, so zu tun, ich werde nach dem letzten code, der funktioniert. Ich habe diese arbeiten und schafft es eine schöne grafische Präsentation. Werde nach dem endgültigen code für andere zu sehen.
InformationsquelleAutor Steve Tjoa
Fertigen Antworten, dass das Problem behoben:
Danke sehr viel Steve. Sie haben eine große Hilfe gewesen. Ich studierte Geographie in der Schule, keine Programmierung, das ist also ziemlich schwierig für mich.
Hier ist der Letzte code, der funktioniert für mich.
Ich nicht wirklich verstehen, die Zeilen zwischen "Ergebnisse=cursor.fetchall()" und die folgenden vier Zeilen code, um die Erstellung von arrays. Ich bin froh, dass Sie tun, weil ich es anschaue und es immer noch nicht sinken.
ich danke Ihnen sehr. Dies hilft eine Menge.
David
InformationsquelleAutor David Kulpanowski