Il mio nome è David e io lavoro per un servizio di ambulanza in Florida.Matplotlib grafico a barre asse x non tracciare valori stringa
Sto usando Python 2.7 e matplotlib. Sto tentando di raggiungere il mio database di chiamate ambulanze e di contare il numero di chiamate che si verificano in ogni giorno della settimana.
Utilizzerò quindi matplotlib per creare un grafico a barre di queste informazioni per fornire ai paramedici un grafico visivo di quanto sono occupati ogni giorno.
Ecco il codice che funziona molto bene:
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()
il codice mostrato sopra funziona molto bene. Restituisce un grafico piacevole e sono felice. Voglio solo fare un cambiamento.
Invece dell'asse X che mostra i nomi dei giorni della settimana, come "Domenica", mostra il numero intero. In altre parole, domenica è 1, lunedì è 2, ecc.
La mia correzione per questo è che riscrivo la mia query sql per utilizzare DATENAME() anziché DATEPART(). Di seguito è riportato il mio codice SQL per restituire il nome della settimana (anziché un numero intero).
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)
Tutto il resto nel mio codice Python rimane lo stesso. Tuttavia questo non funzionerà e non riesco a capire i messaggi di errore.
Qui ci sono i messaggi di errore:
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
Non riesco a capire questo fuori.
In sintesi, quando ho uscita i miei dati con l'asse x come numeri interi che rappresentano i giorni della settimana e l'asse y che mostra un conteggio del numero di incidenti ambulanza, Matplotlib produrrà un bel grafico. Ma quando il mio output di dati è l'asse x è una stringa (domenica, lunedì, ecc.). quindi Matplotlib non funzionerà.
ho fatto diverse ore di ricerca su Google e la lettura della documentazione matplotlib. Per favore aiutatemi con questo. Spero di usare Matplotlib come motore dei miei rapporti.
Questo sembra che potrebbe essere una buona risposta. Ho intenzione di provarlo subito. Sfortunatamente, il prossimo grafico a barre che devo creare è il numero di tipi di incidenti che le ambulanze rispondono. Ci sono circa 60 diversi tipi di incidenti. Non riesco a codificare hard 60 diversi tipi di valori per l'asse x. È troppo incline all'errore. –
continuazione dal post precedente. SPSS e SAS creano facilmente grafici a barre usando valori nominali. Ho difficoltà a credere che sia così difficile per Matplotlib. Deve esserci qualcosa di semplice che mi manca! Ma cos'è ? –
Nuovo commento: è possibile aggiungere una tabella SQL che mappa gli interi in giorni o numeri interi in tipi di incidente. Esempio: 'create table IncidentTypes (pk int chiave primaria auto_increment, Name varchar (20))'. Quindi unisciti ai tavoli. Questo è flessibile e modulare. È possibile fare riferimento a un tipo di incidente tramite chiave (int) o nome (in Python). –