问题描述
来自
由于 x_dates[::2]
的长度是 50 ,ticknumber 根本不匹配.我如何解决它??
我通常使用下面的方法.您应该知道 tickvals
将被视为一个 位置 参数,并且最适合(可能仅)用于数值而不是日期.使用 ticktext
以您喜欢的格式显示日期.
片段 1:
fig.update_xaxes(tickangle=45,滴答模式 = '数组',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:
那么为什么这第一次对您不起作用?几个原因:
- 您重新采样的 pandas 系列 y 将日期作为索引,因此
y.index
被设置为 x-轴值. y.index
返回日期- 当您通过
fig.update_xaxes(tickvals)
设置刻度线 positions 时,这对 整数 值效果更好.
我做了什么来修复它?
- 我在重新采样后重置了索引,以便
y.index
不返回日期. - 使用
.to_frame
将 y 更改为数据帧. - 更改为
fig.add_trace(go.Scatter(x=y.index, y=yy))
否则会失败,因为这现在是数据帧而不是系列. - 您的日期现在检索为
x_dates = y.ds
我知道 y=yy
看起来真的很奇怪,但我只是把它留下来作为一个友好的提醒,让你的 Pandas 系列或数据框比单个名称更合理像 y
这样的字母更容易与单个、无索引的数组或列表混淆.
完整代码:
将pandas导入为pd将 numpy 导入为 np导入 plotly.graph_objects as go导入 plotly.offline 作为 py导入 plotly.express 作为 px从 plotly.offline 导入 init_notebook_mode# 数据np.random.seed(42)特征 = pd.DataFrame({'ds': pd.date_range('20200101', period=100*24, freq='H'),'y': np.random.randint(0,20, 100*24) ,'yhat': np.random.randint(0,20, 100*24) ,'价格':np.random.choice([6600, 7000, 5500, 7800], 100*24)})# 重采样y = feature.set_index('ds').resample('D')['y'].sum()#.to_frame()y=y.to_frame()y.reset_index(就地=真)# 情节设置fig = go.Figure()fig.add_trace(go.Scatter(x=y.index, y=y.y))# x-ticks 准备x_dates = y.dstickvals=np.arange(0, y.shape[0]).astype(int)[0::40]滴答文本=x_dates# 更新标记fig.update_xaxes(tickangle=45,滴答模式 = '数组',滴答=滴答,ticktext=[d.strftime('%Y-%m-%d') for d in ticktext])图.show()
From plotly doc:
Example:
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()
Result:
Since length of x_dates[::2]
is 50 , the ticknumber doesn't match at all .How do I sovle it ??
I normally use the approach below. You should know that tickvals
is to be regarded as a positional argument and works best (perhaps only) with numerical values and not dates. Use ticktext
to display the dates in your preferred format.
Snippet 1:
fig.update_xaxes(tickangle=45,
tickmode = 'array',
tickvals = df_tips['date'][0::40],
ticktext= [d.strftime('%Y-%m-%d') for d in datelist])
Plot 1:
Now you can change tickvals=np.arange(0, y.shape[0]).astype(int)[0::40]
to tickvals=np.arange(0, y.shape[0]).astype(int)[0::80]
and get:
Plot 2:
So why didn't this work for you the first time? A number of reasons:
- Your resampled pandas series y had dates as indexes, so
y.index
were set as x-axis values. y.index
returns dates- When you set the tickmark positions through
fig.update_xaxes(tickvals)
, this works better with integer values.
And what did I do to fix it?
- I reset the index after resampling so that
y.index
does not return dates. - Changed y to a dataframe using
.to_frame
. - Changed to
fig.add_trace(go.Scatter(x=y.index, y=y.y))
which otherwise would have failed since this is now a dataframe and not a series. - Your dates are now retrieved as
x_dates = y.ds
I know y=y.y
looks really weird, but I just left it like that as a friendly reminder to give your pandas series or dataframes more sensible names than a single letter like y
that's more likely to be confused with a single, index-free, array or list.
Complete code:
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()
这篇关于Plotly:如何设置自定义 xticks的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!