plotly 座標軸範圍截斷rangebreaks使用的一個注意點

2023-05-09 06:00:42

plotly座標軸截斷混合設定且指定設定截斷時間的時候需要注意先後順序

  • 大範圍的時間要在小範圍的時間前設定,比如日內時間的截斷要設定在日期截斷的後面
  • 同範圍的規則截斷要在指定截斷前設定,對日期的截斷,規則系截斷最好在指定截斷前設定,六日截斷規則在指定日期截斷前

以上兩條為測試出來的規律,具體細節尚未細究與驗證

1.測試程式碼:繪製不設定座標軸範圍截斷的圖

df = df[['datetime', 'v']]

fig = go.Figure(data=go.Figure(go.Scatter(x=df['datetime'],
                                          y=df['v'],
                                          mode='lines+markers',
                                          line=dict(width=1),
                                          marker=dict(size=1)
                                          )))

fig.update_xaxes(tickformat="%H:%M\n%Y-%m-%d",)

先看不設定座標軸範圍截斷的圖
中間有大片沒有資料的線,佔據了大量空間,將資料形狀擠壓得看不出來

2.測試程式碼:繪製設定座標軸範圍截斷的圖,去除座標軸中的無資料的空白的時間段

df = df[['datetime', 'v']]

資料時間序列 = pd.Series(df['datetime'].dt.date.unique())
全量時間序列 = pd.Series(pd.date_range(start=資料時間序列.min(), end=資料時間序列.max(), freq='D').date)
需要刪除時間序列 = 全量時間序列[全量時間序列.isin(資料時間序列) == False].values
需要刪除時間序列 = [i.strftime('%Y-%m-%d') for i in 需要刪除時間序列]

fig = go.Figure(data=go.Figure(go.Scatter(x=df['datetime'],
                                          y=df['v'],
                                          mode='lines+markers',
                                          line=dict(width=1),
                                          marker=dict(size=1)
                                          )))

fig.update_xaxes(
    tickformat="%H:%M\n%Y-%m-%d",
    rangebreaks=[
        dict(bounds=[6, 1], pattern='day of week'),   # 設定週六週日截斷,規則截斷
        dict(values=需要刪除時間序列),                 # 補充截斷一天中沒有資料的日期,指定日期截斷
        dict(bounds=[11.6, 13.4], pattern="hour"),    # 空白時間段,時間範圍小於天
        dict(bounds=[15.1, 20.9], pattern='hour'),    # 空白時間段
        dict(bounds=[23.1, 8.9], pattern='hour')]     # 空白時間段
)

新增時間截斷後,資料看起來就連貫了很多

3.測試程式碼:繪製設定座標軸範圍截斷的圖,去除座標軸中的無資料的空白的時間段,但是將需要截斷的時間設定在需要截斷的日期前,這樣會出現錯誤

df = df[['datetime', 'v']]
資料時間序列 = pd.Series(df['datetime'].dt.date.unique())
全量時間序列 = pd.Series(pd.date_range(start=資料時間序列.min(), end=資料時間序列.max(), freq='D').date)
需要刪除時間序列 = 全量時間序列[全量時間序列.isin(資料時間序列) == False].values
需要刪除時間序列 = [i.strftime('%Y-%m-%d') for i in 需要刪除時間序列]

fig = go.Figure(data=go.Figure(go.Scatter(x=df['datetime'],
                                          y=df['v'],
                                          mode='lines+markers',
                                          line=dict(width=1),
                                          marker=dict(size=1)
                                          )))

fig.update_xaxes(
    tickformat="%H:%M\n%Y-%m-%d",
    rangebreaks=[
        dict(bounds=[11.6, 13.4], pattern="hour"),
        dict(bounds=[15.1, 20.9], pattern='hour'),
        dict(bounds=[23.1, 8.9], pattern='hour'),
        dict(bounds=[6, 1], pattern='day of week'),
        dict(values=需要刪除時間序列)

        # 按照規則截斷在指定日期截斷後的順序,畫出來的圖是空白
        # dict(values=需要刪除時間序列),
        # dict(bounds=[6, 1], pattern='day of week'),

    ],
)

出現座標軸重疊的現象,如下圖
當調整週末程式碼在指定日期的程式碼後面的時候,畫圖甚至是空白的