pythonplotlyx轴日期显示所有刻度

问题描述 投票:0回答:1

我正在使用plotly.graph_objects生成嵌入数据的html。

虽然我对这个库非常满意,但在某些情况下我无法让它显示所有的 x 轴刻度,如下所示。

Missing ticks on x-axis

但是,如果我放大,我会得到所有刻度(所需的行为)

问题是:当它们指的是月份时,有什么方法可以强制显示所有刻度线? (在显示一整年的同时显示有关日期的所有刻度会太多刻度)

我当前的代码是:

import pandas               as pd
import plotly.graph_objects as go

list_data_mb    =   [
                        ('2023-01-01',10 ,'dat') , ('2023-01-15',15 ,'dat'),('2023-01-01',10 ,'ind') , ('2023-01-15',15 ,'ind'),
                        ('2023-02-01',20 ,'dat') , ('2023-02-15',25 ,'dat'),('2023-02-01',20 ,'ind') , ('2023-02-15',25 ,'ind'),
                        ('2023-03-01',30 ,'dat') , ('2023-03-15',35 ,'dat'),('2023-03-01',30 ,'ind') , ('2023-03-15',35 ,'ind'),
                        ('2023-04-01',40 ,'dat') , ('2023-04-15',45 ,'dat'),('2023-04-01',40 ,'ind') , ('2023-04-15',45 ,'ind'),
                        ('2023-05-01',50 ,'dat') , ('2023-05-15',55 ,'dat'),('2023-05-01',50 ,'ind') , ('2023-05-15',55 ,'ind'),
                        ('2023-06-01',60 ,'dat') , ('2023-06-15',65 ,'dat'),('2023-06-01',60 ,'ind') , ('2023-06-15',65 ,'ind'),
                        ('2023-07-01',70 ,'dat') , ('2023-07-15',75 ,'dat'),('2023-07-01',70 ,'ind') , ('2023-07-15',75 ,'ind'),
                        ('2023-08-01',80 ,'dat') , ('2023-08-15',85 ,'dat'),('2023-08-01',80 ,'ind') , ('2023-08-15',85 ,'ind'),
                        ('2023-09-01',90 ,'dat') , ('2023-09-15',95 ,'dat'),('2023-09-01',90 ,'ind') , ('2023-09-15',95 ,'ind'),
                        ('2023-10-01',100,'dat') , ('2023-10-15',102,'dat'),('2023-10-01',100,'ind') , ('2023-10-15',102,'ind'),
                        ('2023-11-01',104,'dat') , ('2023-11-15',106,'dat'),('2023-11-01',104,'ind') , ('2023-11-15',106,'ind'),
                        ('2023-12-01',108,'dat') , ('2023-12-15',110,'dat'),('2023-12-01',108,'ind') , ('2023-12-15',108,'ind'),
                        ('2024-01-01',112,'dat') , ('2024-01-15',114,'dat'),('2024-01-01',112,'ind') , ('2024-01-15',114,'ind'),
                    ]
df              =   pd.DataFrame(list_data_mb,columns=['date','size','tbs'])
df['date']      =   pd.to_datetime(df['date'], format="%Y-%m-%d")

data            =   [go.Bar(name=tbs, x=dfg['date'], y=dfg['size']) for tbs,dfg in df.groupby(by='tbs')]
fig             =   go.Figure(data)
fig.update_layout(
                    barmode     =   'stack', 
                    title       =   'Tablespaces size over time', 
                    xaxis_title =   'Date', 
                )
fig.update_xaxes(
    rangeslider_visible=True,
    tickmode='array', #linear: too many values. And for "1d", it will not display hours
    rangeselector=dict(
        buttons=list([
            dict(count=1, label="1d" , step="day",   stepmode="backward"),
            dict(count=1, label="1m" , step="month", stepmode="backward"),
            dict(count=6, label="6m" , step="month", stepmode="backward"),
            dict(count=1, label="1y" , step="year",  stepmode="backward"),
            dict(count=1, label="YTD", step="year",  stepmode="todate"  ),
            dict(                      step="all"                       )
        ])
    )
)
fig.update_xaxes(showgrid=True, gridwidth=1, gridcolor='white')
fig.update_yaxes(showgrid=True, gridwidth=1, gridcolor='white')
fig.write_html("./aux_0.html")
python date plotly
1个回答
0
投票

默认情况下,刻度数会根据缩放范围和可用空间(

tickmode='auto'
)自动调整,布局宽度会根据设备屏幕尺寸自动设置。我们仍然可以使用
dtick
来强制plotly每月显示,但是设置线性刻度模式会在更新缩放范围时禁用刻度的动态调整,这可能不是你想要的......

fig.update_xaxes(tickmode='linear', tick0=df['date'].min(), dtick='M1')

我们还可以使用

tickformatstops
根据特定(任意预定义)缩放范围手动调整刻度格式,但不幸的是我们无法为
dtick
执行此操作。

© www.soinside.com 2019 - 2024. All rights reserved.