x 轴刻度日期格式和位置

2024-01-14

我尝试使用 matplotlib 复制最初使用 flotr2 创建的绘图图以进行 pdf 输出。我必须说 flotr 更容易使用...但除此之外 - 我目前一直在尝试将 x 轴上的日期/时间格式化为所需的格式,即小时:分钟,每 2 小时间隔一次,如果期间如果周期长于 1 天且间隔为 1 天,则 x 轴上的值小于 1 天,采用年-月-日格式。

I've read through numerous examples and tried to copy them, but outcome remains the same which is hours:minutes:seconds with 1 to 3 hour interval based on how long is the period. enter image description here

My code:

colorMap = {
        'speed': '#3388ff',
        'fuel': '#ffaa33',
        'din1': '#3bb200',
        'din2': '#ff3333',
        'satellites': '#bfbfff'
}

otherColors = ['#00A8F0','#C0D800','#CB4B4B','#4DA74D','#9440ED','#800080','#737CA1','#E4317F','#7D0541','#4EE2EC','#6698FF','#437C17','#7FE817','#FBB117']

plotMap = {}

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import matplotlib.dates as dates
fig = plt.figure(figsize=(22, 5), dpi = 300, edgecolor='k')
ax1 = fig.add_subplot(111)

realdata = data['data']
keys = realdata.keys()
if 'speed' in keys:
    speed_index = keys.index('speed')
    keys.pop(speed_index)
    keys.insert(0, 'speed')

i = 0
for key in keys:
    if key not in colorMap.keys():
        color = otherColors[i]
        otherColors.pop(i)
        colorMap[key] = color
        i += 1

label = u'%s' % realdata[keys[0]]['name']
ax1.set_ylabel(label)

plotMap[keys[0]] = {}
plotMap[keys[0]]['label'] = label

first_dates = [ r[0] for r in realdata[keys[0]]['data']]

date_range = first_dates[-1] - first_dates[0]


ax1.xaxis.reset_ticks()

if date_range > datetime.timedelta(days = 1):
    ax1.xaxis.set_major_locator(dates.WeekdayLocator(byweekday = 1, interval=1))
    ax1.xaxis.set_major_formatter(dates.DateFormatter('%Y-%m-%d'))
else:
    ax1.xaxis.set_major_locator(dates.HourLocator(byhour=range(24), interval=2))
    ax1.xaxis.set_major_formatter(dates.DateFormatter('%H:%M'))

ax1.xaxis.grid(True)

plotMap[keys[0]]['plot'] = ax1.plot_date(
                                dates.date2num(first_dates), 
                                [r[1] for r in realdata[keys[0]]['data']], colorMap[keys[0]], xdate=True)

if len(keys) > 1:
    first = True
    for key in keys[1:]:
        if first:
            ax2 = ax1.twinx()
            ax2.set_ylabel(u'%s' % realdata[key]['name'])
            first = False
        plotMap[key] = {}
        plotMap[key]['label'] = u'%s' % realdata[key]['name']
        plotMap[key]['plot'] = ax2.plot_date(
                                    dates.date2num([ r[0] for r in realdata[key]['data']]), 
                                    [r[1] for r in realdata[key]['data']], colorMap[key], xdate=True)


plt.legend([value['plot'] for key, value in plotMap.iteritems()], [value['label'] for key, value in plotMap.iteritems()], loc = 2)

plt.savefig(path +"node.png", dpi = 300, bbox_inches='tight')

有人可以指出为什么我没有得到想要的结果吗?

Edit1:

我在绘图后移动了格式化块,现在似乎得到了更好的结果。不过,它们现在仍然是理想的结果。如果周期少于一天,那么我每 2 小时(间隔 = 2)后就会得到蜱虫,但我希望我能在均匀的时间而不是不均匀的时间得到这些蜱虫。那可能吗?

if date_range > datetime.timedelta(days = 1):
    xax.set_major_locator(dates.DayLocator(bymonthday=range(1,32), interval=1))
    xax.set_major_formatter(dates.DateFormatter('%Y-%m-%d'))
else:
    xax.set_major_locator(dates.HourLocator(byhour=range(24), interval=2))
    xax.set_major_formatter(dates.DateFormatter('%H:%M'))

编辑2: 这似乎给了我我想要的:

if date_range > datetime.timedelta(days = 1):
    xax.set_major_locator(dates.DayLocator(bymonthday=range(1,32), interval=1))
    xax.set_major_formatter(dates.DateFormatter('%Y-%m-%d'))
else:
    xax.set_major_locator(dates.HourLocator(byhour=range(0,24,2)))
    xax.set_major_formatter(dates.DateFormatter('%H:%M'))

Alan


你这样做让自己变得比你需要的更加困难。matplotlib可以直接针对datetime对象。我怀疑你的问题是你正在设置定位器,然后进行绘图,并且绘图正在用默认的自动版本替换你的定位器/格式化程序。尝试将有关定位器的逻辑块移至below绘图循环。

我认为这可以取代你的大部分代码:

d = datetime.timedelta(minutes=2)
now =  datetime.datetime.now()
times = [now + d * j for j in range(500)]
ax = plt.gca() # get the current axes
ax.plot(times, range(500))

xax = ax.get_xaxis() # get the x-axis
adf = xax.get_major_formatter() # the the auto-formatter


adf.scaled[1./24] = '%H:%M'  # set the < 1d scale to H:M
adf.scaled[1.0] = '%Y-%m-%d' # set the > 1d < 1m scale to Y-m-d
adf.scaled[30.] = '%Y-%m' # set the > 1m < 1Y scale to Y-m
adf.scaled[365.] = '%Y' # set the > 1y scale to Y

plt.draw()

doc for AutoDateFormatter http://matplotlib.org/api/dates_api.html#matplotlib.dates.AutoDateFormatter

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

x 轴刻度日期格式和位置 的相关文章

随机推荐

  • knitr 运行时需要 Rmd 的文件名

    最近我询问当 knit 运行时是否将 r 变量设置为 Rmd 文件的名称 当 knitr 在 rStudio 中运行时需要 Rnw 的文件名 https stackoverflow com questions 20957129 need t
  • 从 Svelte 组件导出单独的自定义元素

    我试图找出是否可以将每个 Svelte 组件作为单独的自定义元素 带有 Shadow DOM 导出到其自己的 js 文件中 导入任何子元素 即依赖项不包含在同一文件中 有可能吗 Thanks 我假设你正在使用rollup and rollu
  • 使用 TeamCity 为大型项目设置持续集成构建链的首选方法是什么?

    一段时间以来 我的公司正在使用 Maven 和 TeamCity 来构建 Java 东西 目前 我们在持续集成和最终的持续交付方面投入了大量资金 在许多较小的应用程序 应用程序 中 我们正在运行一个大型整体应用程序 大约有 100 万个 L
  • 使用 XQuery 连接 XML 节点

    我需要以下输出
  • Spring-Drools 集成:引用的文件 (kie-spring.xsd) 包含错误

    我正在尝试将 drools 与 Spring 一起使用 春季版本4 01 Drools Kie 版本 6 0 1 我的 kie context xml 有以下错误 在 Eclipse 中 引用的文件包含错误 http drools org
  • Yii Framework/PDO 出现错误 CDbCommand 无法执行 SQL 语句:SQLSTATE[42000]

    我尝试使用 Yii Framework 和 PDO 对象将一些数据插入表中 但出现以下错误 我正在使用此代码构建查询 connection CActiveRecord getDbConnection sql INSERT INTO sms
  • 在整行上使用 udf 过滤 Pyspark Dataframe

    有没有办法选择整行作为列输入到 Pyspark 过滤器 udf 中 我有一个复杂的过滤函数 my filter 我想将其应用于整个 DataFrame my filter udf udf lambda r my filter r Boole
  • JPA Criteria API 过滤器子实体

    代码示例 Entity public class Event Id GeneratedValue private Long id private String name OneToMany mappedBy event private Li
  • 防止 PHP date() 默认为 12/31/1969

    我正在使用 MySQL 数据库和 PHP 我使用以下命令将日期值存储在数据库中DATETIME field 我正在使用此 PHP 代码将输入的日期转换为适合 MySQL 的格式 date Y m d H i s strtotime inpu
  • 水平扩展的微服务实例是否应该共享数据库?

    给定一个拥有关系数据库并需要水平扩展的微服务 我看到两种配置数据库服务器的方法 为服务的每个实例提供其自己的数据库服务器实例 并具有耦合的流程生命周期 OR 让实例连接到共享 由同一服务的相同实例 独立数据库服务器或集群 使用事件驱动架构和
  • NotificationCompat.Builder 中出现 NoClassDefFound 错误

    这个概念是在特定时间收到通知 显然 我做到了 直到我添加了对低于以下版本的支持HoneyComb并在其上方 我已经设置了最小 SDK 版本 8 和目标 SDK 17 由于类编码要大得多 我仅显示存在问题的核心区域 int currentap
  • 为什么最好将 script 标签放在 body 标签的末尾?

    有两个与浏览器网页初始化相关的事件 DOMContentReady document object 解析 HTML 文档并构建 DOM 树 load window object HTML 文档的所有元素都被渲染 显示 根据我的理解 浏览器无
  • 无法找到捆绑的 Java 版本。 MacBook Air M1

    我在配备 intel 的 MacBook Pro 上使用 flutter 一切正常 现在我改用配备 M1 芯片的 MacBook Air 我收到错误无法找到捆绑的 Java 版本 请问我该如何解决它 扑动医生 v Flutter 频道稳定
  • 在 Apps 脚本中设置数据验证显示样式

    是否可以在应用程序脚本中设置下拉列表显示样式 检查文档后发现 API 只允许您在 箭头 和 纯文本 之间进行选择 应用程序脚本文档 https developers google com apps script reference spre
  • 无法以编程方式在 C:\inetpub\wwwroot 中创建文件

    我在 ASP NET 网页的代码后面有一个函数 它创建一个文件 然后使用 JavaScript 命令打开它 这在 IDE 中有效 它会创建文件 询问我要在哪里保存文件 我可以保存它 等等 但是当我安装网站并测试它时 我在尝试创建网站时收到
  • Internet Explorer 8 原型和 XMLHttpRequest

    这部分是对解决方法的请求 部分是试图表明 Internet Explorer 的原型实现仍然有缺陷 以下代码在 Internet Explorer 上不起作用 XMLHttpRequest prototype old XMLHttpRequ
  • 如何关闭 Safari 的预取功能?

    Safari 有一个 功能 可以在您输入网址时预加载页面 现在对于大多数用户来说 这确实是一个功能 可以加快页面加载速度 但对于 Web 开发人员来说 它可能会带来麻烦 特别是当它自动加载您之前使用过但当前无意运行的脚本 例如导入程序或后台
  • 根据 Celery 任务状态更新 Django 模型字段

    在我的模型中 我有一个status默认值为 处理 的字段 在 Django 管理界面中 用户单击 保存 按钮后 表单输入将传递给仅休眠 30 秒的 celery 任务 30 秒后 我该如何 判断celery任务是否成功 更新模型的statu
  • 如果浏览器不是 Internet Explorer 9 或更高版本,则显示一条消息

    我想向我的用户展示一个如下所示的栏 如果 浏览器不是IE 或者 浏览器为 IE 但版本为 8 或更早 请注意 屏幕截图仅用于说明 IE 9is支持我的网站 我发现了这个不错的 jQuery 插件 但我不想使用弹出窗口 http jrejec
  • x 轴刻度日期格式和位置

    我尝试使用 matplotlib 复制最初使用 flotr2 创建的绘图图以进行 pdf 输出 我必须说 flotr 更容易使用 但除此之外 我目前一直在尝试将 x 轴上的日期 时间格式化为所需的格式 即小时 分钟 每 2 小时间隔一次 如