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