来自plotly doc:
布局> xaxis> tickvals:
设置此轴上的刻度线的值 出现。仅在
tickmode
设置为“ array”时有效。用于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()
结果:
由于x_dates[::2]
的长度为50,因此报价号根本不匹配。
我该如何解决??
答案 0 :(得分:6)
我通常使用以下方法。您应该知道tickvals
被认为是 positional 参数,并且最好使用数字值而不是日期(可能仅)。使用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])
情节1:
现在您可以将tickvals=np.arange(0, y.shape[0]).astype(int)[0::40]
更改为tickvals=np.arange(0, y.shape[0]).astype(int)[0::80]
并获得:
图2:
那为什么第一次不适合您呢?原因有很多:
y.index
设置为x轴值。y.index
返回日期 fig.update_xaxes(tickvals)
设置刻度线 positions 时,使用 integer 值会更好。该如何解决?
y.index
不返回日期。.to_frame
将y更改为数据框。fig.add_trace(go.Scatter(x=y.index, y=y.y))
,否则将失败,因为这现在是一个数据框而不是一个序列。x_dates = y.ds
我知道y=y.y
看起来真的很奇怪,但是我只是这样想,是为了提醒您,给熊猫系列或数据框起一个比{{1 }}更有可能与单个无索引的数组或列表混淆。
完整代码:
y