x 轴为 24 小时的条形图,日期时间数据仅为本部分的开头

2023-11-29

我想绘制一个条形图(或直方图,但不是其他图),使得 x 值对应于时间段,但 x 轴标签是从 00:00 到 23:59,间隔为半小时。

问题出在我的数据框中:[“开始时间”] 列中的值的类型为“datetime.time”,看起来像

0    00:30:00

1    06:00:00

2    07:00:00

3    09:10:00

4    15:30:00

5    18:00:00

6    19:00:00

['Main Street Green (s)'] 是相应的值。例如:

0     NaN

1    13.5

2    25.5

3    50.5

4    55.5

5    20.5

6    38.5

我希望从 00:00 到 00:30 的条形高度为 0 00:30 到 06:00 的栏高度为 13.5 06:30 到 07:00 的栏高度为 25.5 ...

我看过很多线图。https://www.programcreek.com/python/example/61484/matplotlib.dates.HourLocator是我发现的最有价值的资源

plt.rcParams['figure.figsize'] = (8.0, 6.0)
ax = plt.subplot(111)
ax.plot(Dayton_weekday["Start Time"], Dayton_weekday['Main Street Green (s)'], color = 'blue', label="main street")
#set ticks every half an hour
ax.xaxis.set_major_locator(mdates.HourLocator(byhour=range(0,24,48))) 
#set major ticks format
ax.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M'))
ax.set_xlim(["00:00", "23:59"])
ax.set_ylim(bottom=0)

在我的代码中我使用 ax.plot 那是因为如果我使用 ax.bar 将返回“ValueError:微秒必须在 0..999999” 所以我不知道如何使用我拥有的数据绘制条形图


这是一种可以为您提供所需内容的方法。

import datetime as dt
import matplotlib.pyplot as plt
import numpy as np

手动创建我们想要绘制的时间。在您的数据集中,列出的时间与上一栏的结束时间相对应。为了适应酒吧经过午夜的情况,时间可能更容易与酒吧的开始相对应。在下面的代码中,我修改了您的原始数据集以使用这种方法。列表中的第一个时间将是图的 x 轴上列出的第一个时间。

times = [dt.time(0,30,0),
         dt.time(6,0,0),
         dt.time(7,0,0),
         dt.time(9,10,0),
         dt.time(15,30,0),
         dt.time(18,0,0),
         dt.time(19,0,0)]

而不是绘制dt.time()在 x 轴上,可以更轻松地绘制一天中经过的秒数。下面我们使用列表理解来转换times进入经过的秒数。

seconds = [(x.hour * 3600 + x.minute * 60 + x.second)
           for x in times]

注意:我删除了NaN在。。。之初values并添加了一个虚构的5.5到最后,以便可以显示从 19:00 到 0:30 的柱线示例。

# manually add the y-axis values
values = [13.5,
          25.5,
          50.5,
          55.5,
          20.5,
          38.5,
          5.5]

现在我们创建两个列表,用于指定刻度在 x 轴上的放置位置,以及为每个刻度分配什么标签。如果经过的秒数可以被 1800(30 分钟)整除,则该数字将用作刻度之一。start_time将是第一个项目经过的秒数times。这是 x 轴开始的位置。

start_time = (times[0].hour * 3600 + times[0].minute * 60 + times[0].second)
xticks = [x + start_time for x in range(60 * 60 * 24) if x % 1800 == 0]

为了显示时间而不是经过的秒数,我们必须使用dt.timedelta()将整数转换为dt.time。如果start_time是一个大于0,那么就会有xticks值至少为86400。我们必须减去86400从这些值,以防止xticklabels从出现为one day, 0:30.

def label_format(seconds):
    if seconds >= 86400:
        seconds -= 86400

    return str(dt.timedelta(seconds=seconds))

xticklabels = [label_format(x) for x in xticks]

现在我们可以创建情节了。由于我们要创建条形宽度不等的直方图样式图表,因此我们需要一种方法来指定条形宽度。bar_traits()可用于根据 x 轴的起点和下一个条形的起点来确定条形的起点和宽度。

def bar_traits(ix, second, seconds, start_time):
    if ix < len(seconds) - 1:
        if seconds[ix + 1] < second:
            width = 86400 + seconds[ix + 1] - second
        else:
            width = seconds[ix + 1] - second
    else:
        if start_time < second:
            width = 86400 + start_time - second
        else:
            width = start_time - second
    if start_time > second:
        second += 86400

    return second, width

使用代码创建绘图bar_traits()处理午夜的绘图。

fig, ax = plt.subplots(figsize=(16,8))

for ix, (second, value) in enumerate(zip(seconds, values)):
    second, width = bar_traits(ix, second, seconds, start_time)
    ax.bar(second, value, width=width, align='edge', color='C0')

ax.set_xticks(xticks)
ax.set_xticklabels(xticklabels, rotation=90)

plt.show()

enter image description here

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

x 轴为 24 小时的条形图,日期时间数据仅为本部分的开头 的相关文章

随机推荐

  • 为什么我需要 IoC 容器而不是简单的 DI 代码? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 Locked 这个问题及其答案是locked因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动 我一直在使用依赖注入 DI 一段时间 注入构造函数 属性或方法 我从来没有觉得
  • 如何使用非法名称访问此对象属性?

    我正在使用某人编写的 PHP 类来与 BaseCamp API 进行交互 我正在执行的特定调用是检索待办事项列表中的项目 效果很好 我的问题是 我不知道如何访问todo items返回的对象的属性 这是返回对象的 var dump obje
  • 将变量从 Shell 脚本传递到 Fortran 90 程序

    我被这个小问题困住了 我想知道是否可以将 bash shell 脚本的变量传递给 f90 代码 我很确定之前已经在这里讨论过 但我找不到完全相同的副本 您可以直接将参数作为参数传递给程序 program arg1 arg2 您可以使用子例程
  • 什么是胖接口?

    你好 我在电影行业工作 模拟和应用工作室效果 我可以问一下什么是胖接口吗 我听到网上有人说它是什么 编辑 是的here尼可波拉斯说 我相信非常好的指示 fat interface an interface with more member
  • 如何更改PHP中数组的索引[重复]

    这个问题在这里已经有答案了 我想在执行一些操作后更改数组的索引 我的实际输出是 Array 0 gt Array 0 gt 4 1 gt 6 2 gt Array 0 gt 1 1 gt 7 5 gt Array 0 gt 1 1 gt 7
  • 如何从 Http 集成流程创建 Spring Reactor Flux?

    我有一个与此非常相似的问题如何从 ActiveMQ 队列创建 Spring Reactor Flux 唯一的区别是消息来自 Http 端点而不是 JMS 队列 问题是消息通道由于某种原因没有被填充 或者它没有被 Flux from 拾取 日
  • JavaScript substr();按字限制而不是字符

    我想用单词而不是字符来限制子字符串 我正在考虑正则表达式和空格 但不知道如何实现 场景 使用 javascript jQuery 将一段单词限制为 200 个单词 var postBody postBody substr 200 这很棒 但
  • MongoDB 未授权查询 admin.system.users

    我对 MongoDb 有点陌生 我正在使用 MongoDb v 2 4 这里的问题是 当我使用 auth 参数运行 mongod 时 即使在经过身份验证后 我也无法执行简单的操作 例如 显示用户 但如果我在没有 auth 参数的情况下运行
  • 复选框未显示在下拉列表中

    我必须从下拉列表中进行多项选择 所以我已经提到了这个link 但是 当我尝试在浏览器中打开该程序时 我没有看到该复选框 也无法选择更多数据 我的脚本看起来像这样
  • 如何在liferay DXP中添加语言图标

    如何在liferay 7 liferay ce portal 7 0 ga4 中添加语言图标图像 我已按照以下文章中提到的步骤进行操作 https web liferay com web salman khan blog blogs add
  • Java正则表达式匹配无回车符后跟换行符

    我试过了 r n但这行不通 你怎么做到这一点 我很欣赏 在类似 Java 的代码中 您需要使用 r n 谢谢你 根据您的要求 r n 前面有除回车符之外的任何字符的换行符 这意味着换行之前必须有一个字符 and 两个符号将被匹配
  • ASP.NET Masterpage 中的 Google Maps API:为什么它保持空白?

    当在 Visual Studio localhost port 服务器中启动时 这个简单的示例以纯 html 运行
  • D3:树形图中的超链接

    我在超链接 Reingold Tilford 树图中的子元素时遇到问题 该图是在 D3 中构建的 并且基于 Mike Bostock 使用的示例 http bl ocks org mbostock 4339184 我的代码和 JSON 文件
  • 如何将 ASP.NET 网站转换为 SharePoint 网站?

    假设您有一个包含隐藏代码的 ASP NET 站点 现在 您需要将此网站移动到 SharePoint 环境 在该环境中它将成为其自己的 Web 应用程序中网站集的根网站 在不完全重新设计每个页面的情况下实现这一目标的最简单方法是什么 以下是一
  • api <21 的可绘制着色

    是否可以为 api
  • C# 循环遍历 List> 以填充 DataTable

    我需要循环遍历字典列表 List
  • iPhone 上的自定义相机变焦功能

    我是 XCode 新手 我正在尝试开发具有覆盖视图的自定义相机 我能够很好地加载它并且工作得很好 现在我想添加通过叠加视图上的按钮激活的缩放功能 有人可以指导我吗 我试图找出如何变焦相机 但我还没有找到任何东西 谢谢 您可以使用camera
  • 弹出窗口外部点击设置为 false [setOutsideTouchable(false)] 不起作用

    创建布局充气器 尝试 LayoutInflater inflator LayoutInflater from this 创建视图 final View menuview inflater inflate R layout menu View
  • Gatsby - 页面刷新损坏

    我的盖茨比网站上的一个页面出现问题 如果我从任何其他页面转到该页面 那么它会呈现良好的效果 但是 如果我直接点击链接 或者在加载后刷新页面 那么它就无法正确呈现 所有其他页面都呈现良好 与此不同的一件事是使用柔性显示布局 查看页面结构 它的
  • x 轴为 24 小时的条形图,日期时间数据仅为本部分的开头

    我想绘制一个条形图 或直方图 但不是其他图 使得 x 值对应于时间段 但 x 轴标签是从 00 00 到 23 59 间隔为半小时 问题出在我的数据框中 开始时间 列中的值的类型为 datetime time 看起来像 0 00 30 00