Python / Matplotlib -- 按一年中的某一天列出的日期直方图

2023-12-26

我有一个跨越数百年的日期列表。我想制作一个包含 366 个桶的直方图,一个桶代表一年中的每一天,x 轴以清晰的方式标记,让我可以看到哪个日期是哪个日期(我预计 2 月 29 日会出现下降) , 例如)。

我制作了以下直方图,但易于阅读的 X 轴日期标签会很棒。下面的代码看起来很麻烦,但得到了我想要的(没有 X 轴标签):

from datetime import date, datetime, timedelta
from collections import Counter
import pylab


def plot_data(data):
    """data is a list of dicts that contain a field "date" with a datetime."""

    def get_day(d):
        return d.strftime("%B %d")  # e.g. January 01

    days = []
    n = 366
    start_date = date(2020, 1, 1)  # pick a leap year
    for i in range(n):
        d = start_date + timedelta(days=i)
        days.append(get_day(d))

    counts = Counter(get_day(d['date']) for d in data)
    
    Y = [counts.get(d) for d in days]
    X = list(range(len(days)))

    pylab.bar(X, Y)
    pylab.xlim([0, n])

    pylab.title("Dates day of year")
    pylab.xlabel("Day of Year (0-366)")
    pylab.ylabel("Count")
    pylab.savefig("Figure 1.png")

任何帮助缩短此时间并使 x 轴日期更加灵活和清晰的帮助将不胜感激!


UPDATE

我已将以下想法纳入以下要点 https://gist.github.com/jsundram/ef0543b7c86128faba2c81b887459eaf,它产生如下所示的输出:


尝试检查这段代码:

# import section
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as md
import numpy as np
from datetime import date
from itertools import product

# generate a dataframe like yours
date = [date(2020, m, d).strftime("%B %d") for m, d in product(range(1, 13, 1), range(1, 29, 1))]
value = np.abs(np.random.randn(len(date)))
data = pd.DataFrame({'date': date,
                     'value': value})
data.set_index('date', inplace = True)

# convert index from str to date
data.index = pd.to_datetime(data.index, format = '%B %d')

# plot
fig, ax = plt.subplots(1, 1, figsize = (16, 8))
ax.bar(data.index,
       data['value'])

# formatting xaxis
ax.xaxis.set_major_locator(md.DayLocator(interval = 5))
ax.xaxis.set_major_formatter(md.DateFormatter('%B %d'))
plt.setp(ax.xaxis.get_majorticklabels(), rotation = 90)
ax.set_xlim([data.index[0], data.index[-1]])

plt.show()

这给了我这个情节:

我将数据帧的索引从字符串转换为日期,然后应用了我想要的 xaxis 格式ax.xaxis.set_major_locator and ax.xaxis.set_major_formatter方法。
为了绘制我使用的matplotlib,但将这种方法转化为应该不难pylab.


EDIT

如果您想要几天和几个月的单独刻度,您可以添加辅助轴(选中此example https://matplotlib.org/examples/axes_grid/demo_parasite_axes2.html)如这段代码所示:

# import section
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as md
import numpy as np
from datetime import date
from itertools import product
from mpl_toolkits.axes_grid1 import host_subplot
import mpl_toolkits.axisartist as AA

# generate a dataframe like yours
date = [date(2020, m, d).strftime("%B %d") for m, d in product(range(1, 13, 1), range(1, 29, 1))]
value = np.abs(np.random.randn(len(date)))
data = pd.DataFrame({'date': date,
                     'value': value})
data.set_index('date', inplace = True)

# convert index from str to date
data.index = pd.to_datetime(data.index, format = '%B %d')

# prepare days and months axes
fig = plt.figure(figsize = (16, 8))
days = host_subplot(111, axes_class = AA.Axes, figure = fig)
plt.subplots_adjust(bottom = 0.1)
months = days.twiny()

# position months axis
offset = -20
new_fixed_axis = months.get_grid_helper().new_fixed_axis
months.axis['bottom'] = new_fixed_axis(loc = 'bottom',
                                       axes = months,
                                       offset = (0, offset))
months.axis['bottom'].toggle(all = True)

#plot
days.bar(data.index, data['value'])

# formatting days axis
days.xaxis.set_major_locator(md.DayLocator(interval = 10))
days.xaxis.set_major_formatter(md.DateFormatter('%d'))
plt.setp(days.xaxis.get_majorticklabels(), rotation = 0)
days.set_xlim([data.index[0], data.index[-1]])

# formatting months axis
months.xaxis.set_major_locator(md.MonthLocator())
months.xaxis.set_major_formatter(md.DateFormatter('%b'))
months.set_xlim([data.index[0], data.index[-1]])

plt.show()

产生这个图:

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

Python / Matplotlib -- 按一年中的某一天列出的日期直方图 的相关文章

  • boto3 资源(例如 DynamoDB.Table)的类型注释

    The boto3库提供了几种返回资源的工厂方法 例如 dynamo boto3 resource dynamodb Table os environ DYNAMODB TABLE 我想注释这些资源 以便我可以获得更好的类型检查和完成 但我
  • 如何使用显式引用转储 YAML?

    递归引用非常适合ruamel yaml or pyyaml ruamel yaml dump ruamel yaml load A A id001 id001 然而 它 显然 不适用于普通引用 ruamel yaml dump ruamel
  • 为什么我的代码不能根据字典解码加密字符串?

    我有一本字典 其中包含代表字母的键和值 例如一个简单的 DICT CODE b g n a p o x d t y 我收到了一个加密代码 并将该字符串转换为一个列表 其中每个项目都是一个单词 我需要根据字典中的项目来解决它 代码示例是 wo
  • 当我在 Pandas 中使用 df.corr 时,我的一些列丢失了

    这是我的代码 import numpy as np import pandas as pd import seaborn as sns import matplotlib pyplot as plt data pd read csv dea
  • 当单词以“|”分隔时如何读取文件(埃因霍温)?

    在Python中 我有一个文件 其中的单词由 例如 city state zipcode 我的文件阅读器无法区分单词 另外 我希望我的文件阅读器从第 2 行而不是第 1 行开始 如何让我的文件阅读器分隔单词 import os import
  • numpy 使用 datetime64 进行数字化

    我似乎无法让 numpy digitize 与 datetime64 一起使用 date bins np array np datetime64 datetime datetime 2014 n 1 s for n in range 1 1
  • 更改 python tkinter canvas 中的线坐标

    我画了一条线tkinter Canvas现在我想移动一端 这可能吗 例如和itemconfig import tkinter tk tkinter Tk canvas tkinter Canvas tk canvas pack line c
  • 动态 __init_subclass__ 方法的参数绑定

    我正在尝试让类装饰器工作 装饰器会添加一个 init subclass 方法到它所应用的类 但是 当该方法动态添加到类中时 第一个参数不会绑定到子类对象 为什么会发生这种情况 举个例子 这是可行的 下面的静态代码是我试图最终得到的示例 cl
  • 乘以行并按单元格值附加到数据框

    考虑以下数据框 df pd DataFrame X a b c d Y a b d e Z a b c d 1 2 1 3 df 我想在 列中附加数字大于 1 的行 并在该行中的数字减 1 df 最好应该 然后看起来像这样 或者它可能看起来
  • 具有屏蔽无效值的 pcolormesh

    我试图将一维数组绘制为 pcolormesh 因此颜色沿 x 轴变化 但每个 x 的 y 轴保持不变 但我的数据有一些错误值 因此我使用屏蔽数组和自定义颜色图 其中屏蔽值设置为蓝色 import numpy as np import mat
  • Pandas style.bar 颜色基于条件?

    如何渲染其中一列的 Pandas dfstyle bar color属性是根据某些条件计算的 Example df style bar subset before after color ff781c vmin 0 0 vmax 1 0 而
  • Python 声音(“铃声”)

    我想让一个 python 程序在完成任务时通过发出嘟嘟声来提醒我 目前 我使用import os然后使用命令行语音程序说 进程完成 我更愿意它是一个简单的 铃 我知道有一个函数可以用于Cocoa apps NSBeep 但我认为这与此没有太
  • 无法在 python 3.8 上将带有 webapp 的 python 部署到 azure

    我正在尝试使用部署一个测试项目Flask使用以下方法将框架迁移到 Azure 云中Azure CLI https learn microsoft com en us azure app service containers quicksta
  • 对数据帧的每 2 小时数据进行 Groupby

    我有一个数据框 Time T201FN1ST2010 T201FN1VT2010 1791 2017 12 26 00 00 00 854 69 0 87 1792 2017 12 26 00 20 00 855 76 0 87 1793
  • 处理大文件的最快方法?

    我有多个 3 GB 制表符分隔文件 每个文件中有 2000 万行 所有行都必须独立处理 任何两行之间没有关系 我的问题是 什么会更快 逐行阅读 with open as infile for line in infile 将文件分块读入内存
  • 更改 Python Cmd 模块处理自动完成的方式

    我有一个 Cmd 控制台 设置为自动完成 Magic the Gathering 收藏管理系统的卡牌名称 它使用文本参数在数据库中查询卡片 并使用结果自动完成 建议卡片 然而 这些卡片名称有多个单词 Cmd 会从last到行尾的空间 例如
  • 将 matplotlib 绘图中的小数点更改为逗号

    我在 Debian 上使用 python 2 7 13 和 matplotlib 2 0 0 我想将 matplotlib 绘图中轴和注释上的小数点标记更改为逗号 然而解决方案发布here https stackoverflow com q
  • Python 通过从现有 csv 文件中过滤选定的行来写入新的 csv 文件

    只是一个问题 我试图将 csv 文件中的选定行写入新的 csv 文件 但出现错误 我试图读取的 test csv 文件是这样的 两列 2013 9 1 2013 10 2 2013 11 3 2013 12 4 2014 1 5 2014
  • 如何在单元测试中使用 JSON 发送请求

    我的 Flask 应用程序中有在请求中使用 JSON 的代码 我可以像这样获取 JSON 对象 Request request get json 这一直工作得很好 但是我正在尝试使用 Python 的 unittest 模块创建单元测试 但
  • 如何循环遍历字典列表并打印特定键的值?

    我是 Python 新手 有一个问题 我知道这是一个非常简单的问题 运行Python 3 4 我有一个需要迭代并提取特定信息的列表 以下是列表 称为部分 的示例 已截断 数千个项目 state DEAD id phwl type name

随机推荐

  • Python 在 OS X 上的文本文件中捕获击键值

    我正在尝试监视 Macbook 上的击键 以构建统计分析器 但是我如何将字符与 事件 隔离开来 这更像是 NSEvent 类型 KeyDown loc 850 248 时间 66551 8标志 0x100胜利 0x0 winNum 0 ct
  • ASP.NET Core 中的 URL 编码和解码

    HttpContext Current Server UrlEncode 这仅适用于 NET Framework 如何在 ASP NET Core 中对 URI 参数进行编码或解码 对于 ASP NET Core 2 0 只需添加Syste
  • WPF Dispatcher {“调用线程无法访问此对象,因为另一个线程拥有它。”}

    首先我需要说我对 WPF 和 C 很菜鸟 应用程序 创建 Mandelbrot 图像 GUI 我的调度程序在这种情况下工作得很好 private void progressBarRefresh while con Progress lt 9
  • jquery/javascript 将纯文本消息转换为文本输入字段

    我有以下请求 创建一个纯文本字段 单击编辑触发器时该字段会转换为文本输入元素 离开输入元素时 文本将存储在数据库中 并且该字段将转换回包含新内容的纯文本字段 当在输入中按下 ESC 时 将恢复最近的值 为此 我使用以下代码 div span
  • 从 Laravel 5 中的中间件获取当前路由操作名称

    我有一个这样的中间件
  • 使用 PHP 从 HTTP 重定向到 HTTPS

    我正在开发一个购物车网站 我想在用户输入帐单详细信息时将其重定向到 HTTPS 页面 并保持下一页的 HTTPS 连接 直到他注销 为了做到这一点 我需要在服务器上安装什么 我正在使用 Apache 以及如何从 PHP 完成此重定向 尝试这
  • Angular2 中的错误处理程序

    我有一个关于新类 ErrorHandler 包含在 RC 6 中 的问题 我从官方文档中做了示例 https angular io docs ts latest api core index ErrorHandler class html
  • 如何配置 Vue 路由器来响应查询字符串?

    我的路由器配置如下 它有效并且做了它应该做的事情 import Demo1 from vuex modules demo demo1 vue import Demo2 from vuex modules demo demo2 vue exp
  • ECS无效参考格式错误

    我尝试通过运行任务 由任务定义定义 来使用 Amazon ECS 部署和运行简单的 Dockerized Ruby 后端 但它无法运行我的命令并返回以下错误 CannotPullContainerError API 错误 400 参考格式无
  • void 大小未知时的指针算术 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Ansible,使用 if then else 语句 set_fact

    我试图在运行时根据另一个变量在 Ansible 中使用 set fact 设置一个变量 无论实际值是多少 都使用第一个值 这是我的代码示例 name Global vars get date info set fact jm env loo
  • 表达式树在哪些情况下很有用?

    我完全理解表达式树的概念 但我很难找到它们有用的情况 是否有可以应用表达式树的特定实例 或者它仅作为代码传输机制有用 我觉得我在这里错过了一些东西 谢谢 一些单元测试模拟框架利用表达式树来建立强类型的期望 验证 IE myMock Veri
  • LinkedIn 视频分析 API - timeRange 无效

    使用 linkedIn 视频分析 API 我想每天收集有关我的视频帖子的分析 我的请求 https api linkedin com v2 videoAnalytics q entity entity urn li ugcPost 6662
  • 子/子子域等中间是否可以有通配符?

    如果我想要一个网站域名 其内容如下at last com 其中中间的单词 域可以更改或根本不存在 例如at long last com at final last com或者没有例如at last com 这是否可能 或者是否需要为每个条目
  • ASP.NET 网站 DLL:调试版本与发布版本

    将 ASP NET Web 应用程序 dll 文件上传到网站的 bin 目录时 与重新编译发布版本相比 使用调试版本是否有任何缺点 例如 在网站本地工作时 构建配置设置为 调试 当一切看起来不错时 我会继续上传网站 网络应用程序的最新 dl
  • Tridion UGC 评论显示作者为空

    我已经为用户生成的内容配置了 Tridion 并使用默认 演示模板创建了一个网页 该模板使用文本输入字段来提供评论作者的姓名 评论已被接受 但在显示时 它们将用户名显示为 null 我认为问题在于存储名称 而不是检索它 如果我在内容管理器
  • 使用强名称签署我的程序集会使其无法工作

    我的一位同事在 VB net 中创建了一个程序集 以便通过 COM 互操作与 JScript 一起使用 该程序集过去运行良好 但我们对其进行了签名 现在它似乎只能在 Windows 7 计算机上运行 我测试了 2 台 Windows 7 机
  • 如何使 QTextDocument 适合打印机的整个页面宽度

    在之前的 stackoverflow 之后讨论 https stackoverflow com a 47879329 3336423 我正在尝试使用以下命令生成包含文本和图像的 pdfQt and QTextDocument 这是我作为 M
  • 使用 SQLAlchemy 进行简单验证

    我是 sqlalchemy 的新手 我正在尝试实现模型字段的简单验证 如 Django ORM 提供的那样 整数 电子邮件等的最小值和最大值 SQLAlchemy 可以开箱即用地进行这种字段验证吗 顺便说一句 我将 SQLAlchemy 与
  • Python / Matplotlib -- 按一年中的某一天列出的日期直方图

    我有一个跨越数百年的日期列表 我想制作一个包含 366 个桶的直方图 一个桶代表一年中的每一天 x 轴以清晰的方式标记 让我可以看到哪个日期是哪个日期 我预计 2 月 29 日会出现下降 例如 我制作了以下直方图 但易于阅读的 X 轴日期标