我正在使用plotly.graph_objects生成嵌入数据的html。
虽然我对这个库非常满意,但在某些情况下我无法让它显示所有的 x 轴刻度,如下所示。
但是,如果我放大,我会得到所有刻度(所需的行为)
问题是:当它们指的是月份时,有什么方法可以强制显示所有刻度线? (在显示一整年的同时显示有关日期的所有刻度会太多刻度)
我当前的代码是:
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")
默认情况下,刻度数会根据缩放范围和可用空间(
tickmode='auto'
)自动调整,布局宽度会根据设备屏幕尺寸自动设置。我们仍然可以使用 dtick
来强制plotly每月显示,但是设置线性刻度模式会在更新缩放范围时禁用刻度的动态调整,这可能不是你想要的......
fig.update_xaxes(tickmode='linear', tick0=df['date'].min(), dtick='M1')
tickformatstops
根据特定(任意预定义)缩放范围手动调整刻度格式,但不幸的是我们无法为 dtick
执行此操作。