Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Matplotlib条形图x轴赢得';t打印字符串值_Python_Matplotlib_Bar Chart - Fatal编程技术网

Python Matplotlib条形图x轴赢得';t打印字符串值

Python Matplotlib条形图x轴赢得';t打印字符串值,python,matplotlib,bar-chart,Python,Matplotlib,Bar Chart,我叫大卫,在佛罗里达州的一家救护车服务公司工作 我正在使用Python2.7和matplotlib。我试图进入我的救护车呼叫数据库,统计每个工作日发生的呼叫数 然后,我将使用matplotlib创建一个包含这些信息的条形图,为护理人员提供一个可视化的图形,显示他们每天有多忙 下面是运行良好的代码: import pyodbc import matplotlib.pyplot as plt MySQLQuery = """ SELECT DATEPART(WEEK

我叫大卫,在佛罗里达州的一家救护车服务公司工作

我正在使用Python2.7和matplotlib。我试图进入我的救护车呼叫数据库,统计每个工作日发生的呼叫数

然后,我将使用matplotlib创建一个包含这些信息的条形图,为护理人员提供一个可视化的图形,显示他们每天有多忙

下面是运行良好的代码:

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()
上面显示的代码工作得非常好。它返回一个漂亮的图形,我很高兴。我只想做一个改变

X轴显示的不是一周中几天的名称,例如“Sunday”,而是整数。换句话说,星期天是1,星期一是2,以此类推

我的解决办法是重写sql查询,使用
DATENAME()
而不是
DATEPART()
。 下面显示的是返回周名称的sql代码(与整数相反)

python代码中的所有其他内容都保持不变。但是,这将不起作用,我无法理解错误消息

以下是错误消息:

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
回溯(最近一次呼叫最后一次):
文件“C:\Documents and Settings\kulpandm\workspace\FiscalYearEndReport\CallVolumeByDayOfWeek.py”,第59行,在
plt.bar(星期一呼叫,星期一调度)
文件“C:\Python27\lib\site packages\matplotlib\pyplot.py”,第2080行,在条形图中
ret=最大钢筋(左侧、高度、宽度、底部,**kwargs)
文件“C:\Python27\lib\site packages\matplotlib\axes.py”,第4740行,在条形图中
自我添加补丁(r)
文件“C:\Python27\lib\site packages\matplotlib\axes.py”,第1471行,在add\u补丁中
自我更新补丁限制(p)
文件“C:\Python27\lib\site packages\matplotlib\axes.py”,第1489行,在更新补丁中
xys=patch.get_patch_transform().transform(顶点)
文件“C:\Python27\lib\site packages\matplotlib\patches.py”,第547行,在get\u patch\u转换中
self.\u update\u patch\u transform()
文件“C:\Python27\lib\site packages\matplotlib\patches.py”,第543行,在更新补丁转换中
bbox=变换.bbox.from_边界(x,y,宽度,高度)
文件“C:\Python27\lib\site packages\matplotlib\transforms.py”,第745行,在from\u边界中
返回Bbox.from_区段(x0,y0,x0+宽度,y0+高度)
TypeError:强制使用Unicode:需要字符串或缓冲区,找到浮点
我想不出来

总之,当我输出数据时,x轴是表示一周中天数的整数,y轴是表示救护车事故数量的计数,Matplotlib将生成一个漂亮的图形。但是当我的数据输出是x轴时,它是一个字符串(星期日、星期一等)。那么Matplotlib将无法工作

我已经在Google上做了几个小时的研究,并阅读了matplotlib文档。
请帮我做这个。我希望使用Matplotlib作为我的报告引擎。

不要仅仅为了更改图示而更改SQL代码。相反,对Python代码进行一个小的添加

我相信你可以像这样做。将勾号标签设置为一周中的几天

可以简单地添加以下行:

plt.xticks((1, 2, ..., 7), ('Sunday', 'Monday', ..., 'Saturday'))

编辑:使用虚拟表
IncidentTypes
响应注释的示例,该表将整数键映射到事件类型的名称

cursor.execute('select incident_type_id, count(*), incident_type 
    from Incidents join IncidentTypes using (incident_type_id) 
    group by incident_type_id')
results = cursor.fetchall()
tickpositions = [int(r[0]) for r in results]
numincidents = [int(r[1]) for r in results]
ticklabels = [r[2] for r in results]

plt.bar(tickpositions, numincidents)
plt.xticks(tickpositions, ticklabels)

解决问题的最终完整答案: 非常感谢你,史蒂夫。你帮了大忙。我在大学里学的是地理,不是编程,所以这对我来说很难。 这是最后一个适合我的代码

 import pyodbc
    import matplotlib.pyplot as plt
    MySQLQuery = """
    SELECT 
      DATEPART(WEEKDAY, IIU_tDispatch)AS [IntegerOfDayOfWeek]
    , COUNT(DATENAME(WeekDay, IIU_tDispatch)) AS [DispatchesOnThisWeekday]
    , DATENAME(WEEKDAY, IIU_tDispatch)AS [DayOfWeekOfCall]
    FROM IIncidentUnitSummary
    INNER JOIN PUnit ON IIU_kUnit = PUN_Unit_PK
    WHERE PUN_UnitAgency = 'LC'
    AND IIU_tDispatch BETWEEN 'October 1, 2010' AND 'October 1, 2011'
    AND PUN_UnitID LIKE 'M__'
    GROUP BY DATEPART(WEEKDAY, IIU_tDispatch), DATENAME(WEEKDAY, IIU_tDispatch)
    ORDER BY DATEPART(WEEKDAY, IIU_tDispatch)
    """
    cnxn = pyodbc.connect("a bunch of stuff I don't want to share")
    cursor = cnxn.cursor()
    GraphCursor = cnxn.cursor()
    cursor.execute(MySQLQuery)

    results = cursor.fetchall()
    IntegerDayOfWeek, DispatchesOnThisWeekday, DayOfWeekOfCall = zip(*results)
    tickpositions = [int(r[0]) for r in results]
    numincidents = [int(r[1]) for r in results]
    ticklabels = [r[2] for r in results]
    plt.bar(tickpositions, numincidents)
    plt.xticks(tickpositions, ticklabels)
    #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()

    cursor.close()
    cnxn.close()
我不太理解“results=cursor.fetchall()”和下面四行涉及创建数组的代码之间的关系。我很高兴你这么做,因为我看着它,它仍然没有被理解。 非常感谢你。这很有帮助。
David

您的问题与SQL查询无关,它只是一种结束的方法。您真正要问的是如何在pylab中更改条形图上的文本标签。的文档对于自定义非常有用,但这里简单介绍一个最简单的工作示例(MWE):


这似乎是一个很好的答案。不幸的是,我需要创建的下一个条形图是救护车响应的事件类型的数量。大约有60种不同类型的事件。我无法为x轴硬编码60种不同类型的值。这太容易出错了。继续上一篇文章。SPSS和SAS使用标称值轻松创建条形图。我很难相信这对Matplotlib来说是如此困难。一定有一些简单的东西我错过了!但它是什么呢?请重新评论:您可以添加一个SQL表,将整数映射到天数或将整数映射到事件类型。示例:
创建表IncidentTypes(pk int主键自动递增,名称varchar(20))
。然后加入表格。这是灵活和模块化的。您可以通过键(int)或名称(在Python中)引用事件类型。如果你看,他们做同样的事情。要获得标签(第二个参数),您可以从我前面的评论中建议的SQL表中用Python读取它们。非常感谢Steve。一旦StackOverflow允许我这样做,我将发布最终的代码。我做了这个,它创造了一个很好的演示图形。将发布最终结果代码供其他人查看。其他人是否觉得条形图默认不接受字符串标签很奇怪?@Owen。在这一点上,matplotlib是如此怪异,以至于我怀疑没有人真正理解为什么会发生任何事情。@Owen。幸运的是,seaborn(虽然是基于matplotlib构建的)似乎没有这个问题()。这正是我想要的场景。我有一个长度为20个字符串的数组,另一个长度为整数的数组,我想把它们和y轴上的int数组和x轴上的字符串数组联系起来。非常感谢。
 import pyodbc
    import matplotlib.pyplot as plt
    MySQLQuery = """
    SELECT 
      DATEPART(WEEKDAY, IIU_tDispatch)AS [IntegerOfDayOfWeek]
    , COUNT(DATENAME(WeekDay, IIU_tDispatch)) AS [DispatchesOnThisWeekday]
    , DATENAME(WEEKDAY, IIU_tDispatch)AS [DayOfWeekOfCall]
    FROM IIncidentUnitSummary
    INNER JOIN PUnit ON IIU_kUnit = PUN_Unit_PK
    WHERE PUN_UnitAgency = 'LC'
    AND IIU_tDispatch BETWEEN 'October 1, 2010' AND 'October 1, 2011'
    AND PUN_UnitID LIKE 'M__'
    GROUP BY DATEPART(WEEKDAY, IIU_tDispatch), DATENAME(WEEKDAY, IIU_tDispatch)
    ORDER BY DATEPART(WEEKDAY, IIU_tDispatch)
    """
    cnxn = pyodbc.connect("a bunch of stuff I don't want to share")
    cursor = cnxn.cursor()
    GraphCursor = cnxn.cursor()
    cursor.execute(MySQLQuery)

    results = cursor.fetchall()
    IntegerDayOfWeek, DispatchesOnThisWeekday, DayOfWeekOfCall = zip(*results)
    tickpositions = [int(r[0]) for r in results]
    numincidents = [int(r[1]) for r in results]
    ticklabels = [r[2] for r in results]
    plt.bar(tickpositions, numincidents)
    plt.xticks(tickpositions, ticklabels)
    #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()

    cursor.close()
    cnxn.close()
import pylab as plt

DayOfWeekOfCall = [1,2,3]
DispatchesOnThisWeekday = [77, 32, 42]

LABELS = ["Monday", "Tuesday", "Wednesday"]

plt.bar(DayOfWeekOfCall, DispatchesOnThisWeekday, align='center')
plt.xticks(DayOfWeekOfCall, LABELS)
plt.show()