matplotlib 雙座標 曲線 不同步 (2)完結

 在上一篇中,本人片面的認爲問題解決了,後來認真一看曲線確實同步了,可是橫座標慘不忍睹,如下圖所示:

 認爲是下面這條設置橫座標label 位置的問題,實際上經過測試將這句位置上調整到ax2=axs.twinx() 之前,作用就沒有了,混亂的橫座標是自動生成的。

plt.xticks(pd.date_range(start=start_index,end=end_index,freq='20D'),pd.date_range(start=start_index,end=end_index,freq='20D').astype(str))

至於爲什麼會出現兩條曲線不同步,原因是 pd.date_range(start=start_index,end=end_index,freq='20D') 生成的tick在實際數據中的時間戳是不存在的,找到原因就知道如何處理了:tick 根據實際數據的時間戳生成,當然爲了防止tick_labels 相互覆蓋,只選取有限個點,這裏我選6個,並且爲了美觀格式化爲年月日,函數返回兩個列表ticks 和tick_labels,使用時只需 axs.set_xticks(ticks) axs.set_xticklabels(tick_labels) 就可以了,Code:

def make_local_ticks_and_labels(data_frame):
    label_collection = data_frame.index.to_pydatetime()
    
    label_count = len(label_collection)
    tick_count = label_count//5
    
    tick_labels = []
    ticks = []
    ticks.append(data_frame.index[0])
    tick_labels.append(label_collection[0].strftime('%Y-%m-%d'))
    for i in range(4):
        ticks.append(data_frame.index[tick_count*(i+1)])
        tick_labels.append(label_collection[tick_count*(i+1)].strftime('%Y-%m-%d'))
    tick_labels.append(label_collection[-1].strftime('%Y-%m-%d'))
    ticks.append(data_frame.index[-1])
    return ticks,tick_labels

 效果圖:

 另外,如果要跳過沒數據的那一段要怎麼處理呢?matplotlib官方有文檔skip-dates-where-there-is-no-data,但是感覺理解不了,就自己實現了一個,如何實現請聽下回分解

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章