matplotlib画图时候x轴的标签过于密集的解决方法

我平时画图的时候会用到matplotlib, 感觉matplotlib很不好用。可能是画的太少了,也没有整理的原因。今天工作的时候,遇到了一个问题,查了很多资料,没找到我想要的,最后总算是解决了。这里整理一下。

此方法对于柱状图和直方图均奏效。因为我只测试了这两种画法。
我使用的数据已经上传到了我的git 点击下载
数据的生成过程,我是通过跑脚本一点一点收集的。主要收集的一个指标就是 Seconds_Behind_Master

简单说一下数据:就是数据库主从同步的时候,从服务器同步比主服务器同步慢了多少秒。因为是每隔5s钟统计一次,如果当前的统计中没有延迟,Seconds_Behind_Master为0,这种情况不做统计。

数据有了,做一个简单的切分。然后画图。

简单切分一下数据
date = "2018-11-08"
ret = []
with open(path, "r+") as f:
    for i in f:
        _, _, day, second, _, _, _, num = i.split(" ")
        if day == date:
            ret.append([second.rstrip(','),int(num.rstrip())])  # 预计最多有17280刻度线
            
label_list, num_list = [i[0] for i in ret], [i[1] for i in ret]

切分完成之后,我们能拿到两个列表。一个是label_list,里面存放的是类似18:00:32 一个是num_list,里面存放的是延迟秒数。

然后就开始画图

我用的是matplotlib,所以需要导包

import matplotlib.pyplot as plt
fig, ax = plt.subplots(1, 1)
a = list(range(len(label_list)))
plt.bar(left=a, height=num_list, width=0.4, alpha=0.8, color='red')
# plt.plot(a, num_list)

plt.xticks(a, label_list, rotation=45, fontsize=5)

上面的就是平时正常情况下画的图,
subplot前面俩参数指定的是一个画板被分割成的行和列,后面一个参数则指的是当前正在绘制的编号!
那是个什么编号规则呢?就是 行优先数数规则!
我这里就画了一个图,所以是(1,1)

bar中的两个参数:
left:柱形的左边缘的位置,如果我们指定1那么当前柱形的左边缘的x值就是1.0了
height:这是柱形的高度,也就是Y轴的值了

plt.xticks 就是每个a对应的label_list,这个是为了画出x轴的标签。
但是因为我的数据太多了。
所以画完之后,xticks就过于密集。x轴的坐标太密集。

解决办法找了很久,这里我参考了 一个特别棒的网站

x轴标签过于密集的解决方法!!!

这里面给的一个思路是根据实际情况隐藏一些点,从而实现正常显示。

    for label in ax.get_xticklabels():
        label.set_visible(False)
    for label in ax.get_xticklabels()[::20]:
        label.set_visible(True)
    plt.title(date)
    plt.savefig("{}.jpg".format(date), dpi=500)

set_visible(False)是不显示,为True是显示。 这里我先默认所有的都不显示,然后只展示我显示的。

plt.title()是显示标题。

plt.savefig(“1.jpg”, dpi=500)
以500每英寸内的点数(其实就是提升了图片的像素,更容易看)来对图片进行存储。

完成代码见:https://github.com/guowenjia/code_country/tree/master/matplotlib_study

参考:

https://www.cnblogs.com/qianlifeng/archive/2012/02/13/2350086.html
http://landcareweb.com/questions/638/geng-gai-matplotlibzhong-xhuo-yzhou-shang-de-di-da-pin-lu

猜你喜欢

转载自blog.csdn.net/funnyPython/article/details/83925573