python绘制时间节点事件图
文章目录
- 前言
- 例子
- 封装
- 更新-插图
前言
偶然在官网发现了一个时间节点事件图便学习了一下,横轴为时间列表,纵轴为相应时间的文本内容,可以展示各个时间节点的一些事件。虽然和前端画的没法比,但封装好用起来还是挺方便的。
例子
这个例子来自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绘制时间节点事件图相关推荐
- python绘制时间节点事件图_在节点上绘制带有时间标签的图形
我有一个(有向无环)图,这样每个节点都有一个离散的时间戳,也就是说,每个节点都有一个数字:1,2,3,4...在 图形可能有多个组件,并且时间戳随着图形的方向而增加.在 我把图作为netowrkx对象 ...
- 技术解析:如何用pyecharts绘制时间轮播图
在前天的文章『用python制作动态图表看全球疫情变化趋势』中,由于篇幅原因,在数据处理与数据可视化相关内容上我们只是简单带过,那么我将以python小小白的角度去还原如何处理数据与数据可视化.本文为 ...
- 好玩!PyEcharts 绘制时间轮播图
作者 | 黄伟呢 来源 | 数据分析与统计学之美 这里我需要事先说明一点:不管学习什么,官网是最好的老师.对于pyecharts绘图库,知道了它的绘图原理后,不管绘制任何图形难度并不是很大,唯一难住我 ...
- python绘制帕累托图
python绘制帕累托图代码 1 import pandas as pd 2 import matplotlib.pyplot as plt 3 plt.rcParams['font.sans-ser ...
- Python绘制股票K线图
目录 1 股票K线图知识了解 2 用Python绘制股票K线图 2.1 安装绘制K线图的mpl_finance库 2.2 引入相关库 2.3 用Tushare库获取股票基本数据 2.4 日期格式调整及 ...
- ArcGIS+python 绘制人口流动OD图
ArcGIS+python 绘制人口流动OD图 根据城市间人口流动数据构造城市间人口流动OD图. 数据准备: 1.人口流动数据,基础信息包括origin destination count. 2.基础 ...
- Python绘制股票日K图(九)给折线图加标签
股票当日成交额在股市的排名说明了市场对它的关注度,也是一个很好的指标. 免费获取更多最新股市数据关注头像同名恭祝好! 相应的代码同Python绘制股票日K图(七)给柱状图加上标签差不多,只不过需要注意 ...
- python绘制人际关系图_干货!利用Python绘制精美网络关系图
Python实战社群 Java实战社群 长按识别下方二维码,按需求添加 扫码关注添加客服 进Python社群▲ 扫码关注添加客服 进Java社群▲ 作者丨tan45du 来源丨袁厨的算法小屋(ID:t ...
- 可视化实验十一:利用Python绘制气泡图、雷达图
实验目的: 掌握Python中气泡图.雷达图绘图函数的使用及展示图形的意义 利用上述绘图函数实现数据可视化 实验内容: 练习python中气泡图.雷达图绘图函数的用法,掌握相关参数的概念 根据步骤一绘 ...
最新文章
- MySql错误代码1045的解决方案(修改密码)
- AJAX+JSF组件实现高性能的文件上载
- 《图解HTTP》读书笔记--第5章与HTTP协作的Web服务器
- SAP Spartacus Ngrx 使用的一些准则
- java中int转成String位数不足前面补零 java格式化2位数不足补零
- 你知道C# 反射技术的应用吗?
- 疯狂.NET 通用权限设计 C\S后台管理,B\S前台调用源码样例程序源码下载之 --- 操作权限...
- 为什么李彦宏会候选院士?
- [swift] LeetCode 104. Maximum Depth of Binary Tree
- python装饰器(docorator)详解
- vc 实现打印机打印功能
- 您有一张H5新年贺卡未领取
- 山东理工大学acm非专业程序设计基础答案
- 麦克阿瑟奖得主Dawn Song:区块链能保密和保护隐私?图样图森破!
- 金融知识入门之基金基础概念
- Minecraft Mod 开发:3-第一个物品
- gui开头的歌词_以“去”开头的一句歌词
- excel学习-制作斜线表头
- jsdelivr cdn npm替代方案
- 随手记——Moment.js