1. 程式人生 > >matplotlib畫圖時候x軸的標籤過於密集的解決方法

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