文章目录

  • 前言
  • 例子
  • 封装
  • 更新-插图

前言

偶然在官网发现了一个时间节点事件图便学习了一下,横轴为时间列表,纵轴为相应时间的文本内容,可以展示各个时间节点的一些事件。虽然和前端画的没法比,但封装好用起来还是挺方便的。

例子

这个例子来自matplotlib官网,我只是在其中做了些注释,用到的numpy操作比较复杂,我加了打印语句便于查看矩阵的变化。

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.dates as mdates
from datetime import datetime
# 构造数据
names = ['v2.2.4', 'v3.0.3', 'v3.0.2', 'v3.0.1', 'v3.0.0', 'v2.2.3','v2.2.2', 'v2.2.1', 'v2.2.0', 'v2.1.2', 'v2.1.1', 'v2.1.0','v2.0.2', 'v2.0.1', 'v2.0.0', 'v1.5.3', 'v1.5.2', 'v1.5.1','v1.5.0', 'v1.4.3', 'v1.4.2', 'v1.4.1', 'v1.4.0']dates = ['2019-02-26', '2019-02-26', '2018-11-10', '2018-11-10','2018-09-18', '2018-08-10', '2018-03-17', '2018-03-16','2018-03-06', '2018-01-18', '2017-12-10', '2017-10-07','2017-05-10', '2017-05-02', '2017-01-17', '2016-09-09','2016-07-03', '2016-01-10', '2015-10-29', '2015-02-16','2014-10-26', '2014-10-18', '2014-08-26']# 转换类型 date strings (e.g. 2014-10-18) to datetime
dates = [datetime.strptime(d, "%Y-%m-%d") for d in dates]# Choose some nice levels  定义纵轴长度
levels = np.tile([-5, 5, -3, 3, -1, 1],int(np.ceil(len(dates)/6)))[:len(dates)]
# 上取整拼凑多块瓷砖,截取和dates一样长的一段
print(np.tile([-5, 5, -3, 3, -1, 1],int(np.ceil(len(dates)/6))))
print(levels)# Create figure and plot a stem plot with the date
fig, ax = plt.subplots(figsize=(8.8, 4), constrained_layout=True)
# 标题
ax.set(title="Matplotlib release dates")# 添加线条, basefmt设置中线的颜色,linefmt设置线的颜色以及类型
markerline, stemline, baseline = ax.stem(dates, levels,linefmt="C3-", basefmt="k-",)
# 交点空心,zorder=3设置图层,mec="k"外黑 mfc="w"内白
plt.setp(markerline, mec="k", mfc="w", zorder=3)# 通过将Y数据替换为零,将标记移到基线
markerline.set_ydata(np.zeros(len(dates)))# 构造描述底部、顶部的array
vert = np.array(['top', 'bottom'])[(levels > 0).astype(int)]
print(np.array(['top', 'bottom']))
print(levels > 0)
print([(levels > 0).astype(int)])
print(vert)# 添加文字注释
for d, l, r, va in zip(dates, levels, names, vert):ax.annotate(r, xy=(d, l), xytext=(-3, np.sign(l)*3),textcoords="offset points", va=va, ha="right")# 设置x轴间隔为每四个月
ax.get_xaxis().set_major_locator(mdates.MonthLocator(interval=4))
ax.get_xaxis().set_major_formatter(mdates.DateFormatter("%b %Y\n"))
# 逆时针30度,刻度右对齐
plt.setp(ax.get_xticklabels(), rotation=30, ha="right")# 隐藏y轴线
ax.get_yaxis().set_visible(False)
# 隐藏左、上、右的边框
for spine in ["left", "top", "right"]:ax.spines[spine].set_visible(False)
# 边距仅设置y轴
ax.margins(y=0.1)
plt.show()

演示的结果如下

封装

以后用的时候,当然不愿意写这么多代码,自己简单封装一下,names和dates作为参数传递进去就行,dateFormat和levels设置默认值,也可以外界传入。

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.dates as mdates
from datetime import datetimeplt.rcParams['font.sans-serif'] = ['SimHei']  # 解决中文无法显示的问题
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
def draw_time_text(names, dates, dateFormat="%Y-%m-%d", levels=None):# 转换类型 date strings (e.g. 2014-10-18) to datetimedates = [datetime.strptime(d, dateFormat) for d in dates]if levels == None:# Choose some nice levelslevels = np.tile([-5, 5, -3, 3, -1, 1],int(np.ceil(len(dates)/6)))[:len(dates)]# Create figure and plot a stem plot with the datefig, ax = plt.subplots(figsize=(8.8, 4), constrained_layout=True)# 标题ax.set(title="Marvel movies")# 添加线条, basefmt设置中线的颜色,linefmt设置线的颜色以及类型markerline, stemline, baseline = ax.stem(dates, levels,linefmt="C3-", basefmt="k-",)# 交点空心,zorder=3设置图层,mec="k"外黑 mfc="w"内白plt.setp(markerline, mec="k", mfc="w", zorder=3)# 通过将Y数据替换为零,将标记移到基线markerline.set_ydata(np.zeros(len(dates)))# 构造描述底部、顶部的arrayvert = np.array(['top', 'bottom'])[(levels > 0).astype(int)]# 添加文字注释for d, l, r, va in zip(dates, levels, names, vert):ax.annotate(r, xy=(d, l), xytext=(-3, np.sign(l)*3),textcoords="offset points", va=va, ha="right")# 设置x轴间隔为每四个月ax.get_xaxis().set_major_locator(mdates.MonthLocator(interval=4))ax.get_xaxis().set_major_formatter(mdates.DateFormatter("%b %Y\n"))# 逆时针30度,刻度右对齐plt.setp(ax.get_xticklabels(), rotation=30, ha="right")# 隐藏y轴线ax.get_yaxis().set_visible(False)# 隐藏左、上、右的边框for spine in ["left", "top", "right"]:ax.spines[spine].set_visible(False)# 边距仅设置y轴ax.margins(y=0.1)plt.show()if __name__ == '__main__':names = ['黑寡妇', '永恒族', '上气', '奇异博士2', '雷神4']dates = ['2020-05-01', '2020-11-06', '2021-02-21', '2021-05-07', '2021-11-05']draw_time_text(names, dates)

最后得到的结果

更新-插图

由于评论中提出插图的需求,所以将这个需求的实现更新一下。

    left, bottom, width, height = 0.2, 0.56, 0.25, 0.32# 插图画板位置inset = fig.add_axes([left, bottom, width, height])# 在指定位置生成插图画板import matplotlib.image as mpimgimg = mpimg.imread('永恒族.png') # 打开指定图片inset.imshow(img) # 插图画板中插入指定图片inset.set_xticks([]) # 取消x轴刻度inset.set_yticks([]) # 取消y轴刻度

只需要在显示图片之前加入上面的代码,像这样子。

虽然python能够实现,但是复杂的绘图展示还是交给前端和美工比较合适。比如这里要调整大量的插图位置,就比较麻烦,所以仅仅给出一张图的示例。

python绘制时间节点事件图相关推荐

  1. python绘制时间节点事件图_在节点上绘制带有时间标签的图形

    我有一个(有向无环)图,这样每个节点都有一个离散的时间戳,也就是说,每个节点都有一个数字:1,2,3,4...在 图形可能有多个组件,并且时间戳随着图形的方向而增加.在 我把图作为netowrkx对象 ...

  2. 技术解析:如何用pyecharts绘制时间轮播图

    在前天的文章『用python制作动态图表看全球疫情变化趋势』中,由于篇幅原因,在数据处理与数据可视化相关内容上我们只是简单带过,那么我将以python小小白的角度去还原如何处理数据与数据可视化.本文为 ...

  3. 好玩!PyEcharts 绘制时间轮播图

    作者 | 黄伟呢 来源 | 数据分析与统计学之美 这里我需要事先说明一点:不管学习什么,官网是最好的老师.对于pyecharts绘图库,知道了它的绘图原理后,不管绘制任何图形难度并不是很大,唯一难住我 ...

  4. python绘制帕累托图

    python绘制帕累托图代码 1 import pandas as pd 2 import matplotlib.pyplot as plt 3 plt.rcParams['font.sans-ser ...

  5. Python绘制股票K线图

    目录 1 股票K线图知识了解 2 用Python绘制股票K线图 2.1 安装绘制K线图的mpl_finance库 2.2 引入相关库 2.3 用Tushare库获取股票基本数据 2.4 日期格式调整及 ...

  6. ArcGIS+python 绘制人口流动OD图

    ArcGIS+python 绘制人口流动OD图 根据城市间人口流动数据构造城市间人口流动OD图. 数据准备: 1.人口流动数据,基础信息包括origin destination count. 2.基础 ...

  7. Python绘制股票日K图(九)给折线图加标签

    股票当日成交额在股市的排名说明了市场对它的关注度,也是一个很好的指标. 免费获取更多最新股市数据关注头像同名恭祝好! 相应的代码同Python绘制股票日K图(七)给柱状图加上标签差不多,只不过需要注意 ...

  8. python绘制人际关系图_干货!利用Python绘制精美网络关系图

    Python实战社群 Java实战社群 长按识别下方二维码,按需求添加 扫码关注添加客服 进Python社群▲ 扫码关注添加客服 进Java社群▲ 作者丨tan45du 来源丨袁厨的算法小屋(ID:t ...

  9. 可视化实验十一:利用Python绘制气泡图、雷达图

    实验目的: 掌握Python中气泡图.雷达图绘图函数的使用及展示图形的意义 利用上述绘图函数实现数据可视化 实验内容: 练习python中气泡图.雷达图绘图函数的用法,掌握相关参数的概念 根据步骤一绘 ...

最新文章

  1. MySql错误代码1045的解决方案(修改密码)
  2. AJAX+JSF组件实现高性能的文件上载
  3. 《图解HTTP》读书笔记--第5章与HTTP协作的Web服务器
  4. SAP Spartacus Ngrx 使用的一些准则
  5. java中int转成String位数不足前面补零 java格式化2位数不足补零
  6. 你知道C# 反射技术的应用吗?
  7. 疯狂.NET 通用权限设计 C\S后台管理,B\S前台调用源码样例程序源码下载之 --- 操作权限...
  8. 为什么李彦宏会候选院士?
  9. [swift] LeetCode 104. Maximum Depth of Binary Tree
  10. python装饰器(docorator)详解
  11. vc 实现打印机打印功能
  12. 您有一张H5新年贺卡未领取
  13. 山东理工大学acm非专业程序设计基础答案
  14. 麦克阿瑟奖得主Dawn Song:区块链能保密和保护隐私?图样图森破!
  15. 金融知识入门之基金基础概念
  16. Minecraft Mod 开发:3-第一个物品
  17. gui开头的歌词_以“去”开头的一句歌词
  18. excel学习-制作斜线表头
  19. jsdelivr cdn npm替代方案
  20. 随手记——Moment.js

热门文章

  1. java监控屏幕_java实现人工智能化屏幕监控窗口
  2. mysql 时间 本周 本月_日本人脑洞最大的奇葩恋爱游戏,本周上架Steam,别在吃饭时玩...
  3. markdown符号使用
  4. python金融分析小知识(19)——NLP初探之LDA话题建模
  5. java腾讯滤镜接口_文档中心
  6. hive-jdbc 的大坑
  7. 据说最厉害的黑客,出自少林寺、这是为什么?
  8. I-P-B frame简介
  9. 传说中的“睡眠算法”的输出分析
  10. 保姆级在自己电脑搭建我的世界服务器教程