如何在记账应用中绘制带重复日期的柱状图
发布时间 - 2026-01-06 00:00:00 点击率:次本文介绍在支出追踪应用中绘制柱状图的正确方法,解决因日期重复导致 x 轴自动合并的问题——通过使用数值索引作为横坐标、手动设置刻度标签,确保每个数据点独立显示。
在开发个人记账类应用(如 Expense Tracker)时,常需以日期为横轴、金额为纵轴绘制柱状图来直观展示每日多笔支出。但若原始数据中存在重复日期(例如同一天有多笔消费),直接将 date 列表传入 plt.bar(date, amount) 会导致 Matplotlib 自动去重并聚合——这不是我们想要的效果;我们需要的是“每笔记录一个柱子”,即使日期相同也应独立呈现。
正确的做法是:用整数索引(0, 1, 2, ..., n-1)作为柱子的横坐标位置,再通过 plt.xticks() 显式指定每个位置对应的日期标签。这样既保留了所有数据点的独立性,又准确反映了时间维度信息。
以下是一个完整可运行的示例:
import matplotlib.pyplot as plt # 示例数据:同一天有多笔支出(日期可重复) date = ['2014-1-4', '2014-1-4', '2014-1-4','2014-1-5'] amount = [100, 5000, 1000, 2000] # 创建数值索引:[0, 1, 2, 3] ind = range(len(date)) # 绘制柱状图(x 坐标为索引,非日期字符串) fig, ax = plt.subplots(figsize=(8, 5)) ax.bar(ind, amount, color='#4CAF50', alpha=0.8) # 将索引位置映射为对应日期标签 plt.xticks(ticks=ind, labels=date, rotation=45, ha='right') # 添加基础图表装饰 ax.set_ylabel('Amount (¥)') ax.set_title('Daily Expense Breakdown (with duplicates)') ax.grid(axis='y', linestyle='--', alpha=0.7) plt.tight_layout() # 防止日期标签被截断 plt.show()
✅ 关键要点总结:
- ❌ 不要直接用 bar(date, amount) —— 字符串型日期会触发 Matplotlib 的分类聚合逻辑;
- ✅ 必须用 bar(ind, amount) + xticks(ticks=ind, labels=date) 分离位置与语义;
- ? 若需进一步分组(如按天汇总),应在绘图前用 pandas.groupby('date').sum() 预处理,而非依赖绘图函数;
- ? 对于大量数据,建议添加 rotation=45 和 ha='right' 提升日期标签可读性,并调用 tight_layout() 避免遮挡。
该方案轻量、可靠,适用于 Flask/Django/Streamlit 等各类 Python Web 或桌面记账应用的可视化模块。
# python
# go
# ai
# stream
# django
# igs
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
什么是JavaScript解构赋值_解构赋值有哪些实用技巧
JavaScript如何实现继承_有哪些常用方法
三星、SK海力士获美批准:可向中国出口芯片制造设备
Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】
Laravel怎么实现支付功能_Laravel集成支付宝微信支付
宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程
Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置
Android GridView 滑动条设置一直显示状态(推荐)
Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理
如何解决hover在ie6中的兼容性问题
Laravel如何发送系统通知?(Notification渠道示例)
消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
如何在IIS中新建站点并配置端口与物理路径?
Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能
Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控
深圳网站制作平台,深圳市做网站好的公司有哪些?
Laravel Blade模板引擎语法_Laravel Blade布局继承用法
如何在腾讯云服务器上快速搭建个人网站?
宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法
如何用腾讯建站主机快速创建免费网站?
Android自定义控件实现温度旋转按钮效果
Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程
Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册
合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?
Laravel Seeder填充数据教程_Laravel模型工厂Factory使用
如何用AWS免费套餐快速搭建高效网站?
Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】
PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】
如何用PHP快速搭建CMS系统?
PHP 500报错的快速解决方法
移动端脚本框架Hammer.js
Laravel Octane如何提升性能_使用Laravel Octane加速你的应用
详解Android图表 MPAndroidChart折线图
如何在Windows服务器上快速搭建网站?
如何利用DOS批处理实现定时关机操作详解
开心动漫网站制作软件下载,十分开心动画为何停播?
移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?
如何正确选择百度移动适配建站域名?
Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】
Laravel如何使用Vite进行前端资源打包?(配置示例)
Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤
如何确保FTP站点访问权限与数据传输安全?
Laravel用户密码怎么加密_Laravel Hash门面使用教程
昵图网官网入口 昵图网素材平台官方入口
javascript中对象的定义、使用以及对象和原型链操作小结
JavaScript如何实现错误处理_try...catch如何捕获异常?
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
Laravel集合Collection怎么用_Laravel集合常用函数详解
如何有效防御Web建站篡改攻击?


'2014-1-5']
amount = [100, 5000, 1000, 2000]
# 创建数值索引:[0, 1, 2, 3]
ind = range(len(date))
# 绘制柱状图(x 坐标为索引,非日期字符串)
fig, ax = plt.subplots(figsize=(8, 5))
ax.bar(ind, amount, color='#4CAF50', alpha=0.8)
# 将索引位置映射为对应日期标签
plt.xticks(ticks=ind, labels=date, rotation=45, ha='right')
# 添加基础图表装饰
ax.set_ylabel('Amount (¥)')
ax.set_title('Daily Expense Breakdown (with duplicates)')
ax.grid(axis='y', linestyle='--', alpha=0.7)
plt.tight_layout() # 防止日期标签被截断
plt.show()