Plotly:如何设置自定义 xticks

Mit*_*ril 6 python plotly plotly-python

来自plotly 文档

布局 > xaxis > tickvals:

设置此轴上出现刻度的值。仅当tickmode设置为“数组”时才有效。与 一起使用 ticktext

布局 > xaxis > 刻度文本:

通过 设置在刻度位置显示的文本tickvals。仅当tickmode设置为“数组”时才有效。与 一起使用tickvals

例子:

import pandas as pd
import numpy as np

np.random.seed(42)
feature = pd.DataFrame({'ds': pd.date_range('20200101', periods=100*24, freq='H'), 
                        'y': np.random.randint(0,20, 100*24) , 
                        'yhat': np.random.randint(0,20, 100*24) , 
                        'price': np.random.choice([6600, 7000, 5500, 7800], 100*24)})


import plotly.graph_objects as go
import plotly.offline as py
import plotly.express as px
from plotly.offline import init_notebook_mode

init_notebook_mode(connected=True)


y = feature.set_index('ds').resample('D')['y'].sum()

fig = go.Figure()
fig.add_trace(go.Scatter(x=y.index, y=y))


x_dates = y.index.to_series().dt.strftime('%Y-%m-%d').sort_values().unique()


layout = dict(
    xaxis=dict(
        tickmode="array",
        tickvals=np.arange(0, x_dates.shape[0],2).astype(int),
        ticktext=x_dates[::2],
        tickformat='%Y-%m-%d',
        tickangle=45,
    )
)

fig.update_layout(layout)
fig.show()

Run Code Online (Sandbox Code Playgroud)

结果:

在此处输入图片说明

由于长度x_dates[::2]是 50 ,所以刻度数根本不匹配。我如何解决它?

ves*_*and 8

我通常使用下面的方法。您应该知道这tickvals被视为位置参数,并且最适合(可能仅)使用数值而不是日期。用于ticktext以您喜欢的格式显示日期。

片段 1:

fig.update_xaxes(tickangle=45,
                 tickmode = 'array',
                 tickvals = df_tips['date'][0::40],
                 ticktext= [d.strftime('%Y-%m-%d') for d in datelist])
Run Code Online (Sandbox Code Playgroud)

情节 1:

在此处输入图片说明

现在您可以更改tickvals=np.arange(0, y.shape[0]).astype(int)[0::40]tickvals=np.arange(0, y.shape[0]).astype(int)[0::80]并获得:

情节 2:

情节2

那么为什么这第一次对你不起作用呢?几个原因:

  1. 您重新采样的熊猫系列 y将日期作为索引,因此y.index设置为 x 轴值。
  2. y.index返回日期
  3. 当您通过设置刻度线位置fig.update_xaxes(tickvals),这对数值效果更好。

我做了什么来修复它?

  1. 我在重新采样后重置了索引,这样y.index就不会返回日期。
  2. 使用 将 y 更改为数据框.to_frame
  3. 更改为fig.add_trace(go.Scatter(x=y.index, y=y.y))否则会失败,因为这现在是数据框而不是系列。
  4. 您的日期现在检索为 x_dates = y.ds

我知道y=y.y看起来奇怪,但我只是把它留下来作为一个友好的提醒,给你的 Pandas 系列或数据帧更合理的名称,而不是像y这样更容易与单个、无索引、数组或列表混淆的单个字母。

完整代码:

import pandas as pd
import numpy as np
import plotly.graph_objects as go
import plotly.offline as py
import plotly.express as px
from plotly.offline import init_notebook_mode

# data
np.random.seed(42)
feature = pd.DataFrame({'ds': pd.date_range('20200101', periods=100*24, freq='H'), 
                        'y': np.random.randint(0,20, 100*24) , 
                        'yhat': np.random.randint(0,20, 100*24) , 
                        'price': np.random.choice([6600, 7000, 5500, 7800], 100*24)})

# resampling
y = feature.set_index('ds').resample('D')['y'].sum()#.to_frame()
y=y.to_frame()
y.reset_index(inplace=True)

# plotly setup
fig = go.Figure()
fig.add_trace(go.Scatter(x=y.index, y=y.y))

# x-ticks preparations
x_dates = y.ds
tickvals=np.arange(0, y.shape[0]).astype(int)[0::40]
ticktext=x_dates

# update tickmarks
fig.update_xaxes(tickangle=45,
                 tickmode = 'array',
                 tickvals = tickvals,
                 ticktext=[d.strftime('%Y-%m-%d') for d in ticktext])

fig.show()
Run Code Online (Sandbox Code Playgroud)