matplotlib自定义坐标轴刻度完成20万+数据的可视化

需求: 拉取指定时间段的虚拟机监控数据,画使用率趋势图。
数据样式:[监控项名称,值,时间戳]
数据总量/条: 20万+ /天

拉取这里就不做叙述了,着重说下可视化部分遇到的问题。
问题1: 原先将时间戳转为文本格式,使用时间(时:分:秒)作为x轴,但数据量太大,x轴标签重叠严重。

  • 解决办法
    使用set_major_locator对x轴标签进行间隔显示。
import matplotlib.pyplot as plt
from matplotlib import ticker
fig = plt.figure(figsize=(50, 12)) # 创建画布,figsize设置figure尺寸。(宽,高)
ax = fig.add_subplot()#添加子图
xtick_spacing = 60 #间隔大小,隔60个标签显示一次
ax.xaxis.set_major_locator(ticker.MultipleLocator(tick_spacing))    

效果:

matplotlib自定义坐标轴刻度完成20万+数据的可视化_第1张图片
问题2: 一台虚机的数据能用上面的办法解决,但上百台后,x轴又重叠在了一起。
再次重叠的原因是因为虽然时间段相同,但每台虚机的x轴数据(抓取时间)是存在出入,这导致ticker.MultipleLocator(tick_spacing)进行间隔显示后,每台虚机都有自己的x轴标签。

  • 解决办法
    通过分析,重叠的原因是因为每台虚机都有自己的x轴标签,所以解决办法是自定义一个统一的x轴标签。
   import matplotlib.pyplot as plt
   fig = plt.figure(figsize=(50, 12)) # 创建画布,figsize设置figure尺寸。(宽,高)
   ax = fig.add_subplot()#添加子图
   seconds = 60 * 60 * 24#一天的秒数
   plt.xlim(0, seconds) #设置x轴刻度范围
   plt.xticks(rotation=90, fontsize=30)#x轴标签旋转90度,字体大小为30
   # x轴统一标签
   xlabels = [str(n) + ':00' for n in range(9, 24)] + [str(abs(n)) + ':00' for n in range(0, 10)]
   xlabels[0] = 'lastday ' + xlabels[0]
   xlabels[-1] = 'today ' + xlabels[-1]
   xticks = [xlabels.index(label) * 60 * 60 for label in xlabels]#标签间隔1个小时的秒数
   ax.set_xticks(xticks)#设置标签位置
   ax.set_xticklabels(xlabels)#设置标签
   #设置轴线长宽、颜色及刻度朝向
   ax.tick_params(direction='in', width=2,length=4,colors='black')

效果:
自定义标签
问题3: 如何将20万+虚机监控数据(时间戳,值)一一对应到自定义的坐标轴上?
问题2中,自定义了统一的x轴文本标签解决了标签重叠问题。但数据是以时间戳存在的,如何使每条数据都能在x轴上找到对应的点呢?其实问题2的代码中已经给出了答案。

   seconds = 60 * 60 * 24#一天的秒数
   plt.xlim(0, seconds) #设置x轴刻度范围
   ...

如上,设置的x轴数据范围是0~1天的秒数,而拉取数据的时间段也是1天,而每条数据都有一个时间戳,时间戳本质上是一个秒数。所以,数据的x坐标可以表示为(数据时间戳-拉取时间段的起始时间的时间戳),由此便可以得到一个时间差值,这个差值,便是这条数据在这一天中所处的位置。

最终效果:
matplotlib自定义坐标轴刻度完成20万+数据的可视化_第2张图片

博主其他文章推荐:
[1] 【python实用特性】-切片

[2] 【python实用特性】- 迭代、可迭代对象、迭代器

[3] 【python实用特性】- 列表生成式

[4] 【python实用特性】- yield生成器

[5] Python+selenium实现自动爬取实例

[6] python爬取豆瓣Top250-改进版

[7] requests 设置请求头、代理

[8] requests使用cookie模拟登陆豆瓣

[9] requests使用session保持会话

你可能感兴趣的:(数据可视化)