情节:如何设置自定义标记

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

来自plotly doc

layout> xaxis> tickvals:

设置此轴上的刻度线的值出现。仅在tickmode设置为“数组”时有效。用于ticktext

layout> xaxis> ticktext:

设置在通过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()

结果:

enter image description here

由于x_dates[::2]的长度为50,所以报价号根本不匹配。我如何解决它?

python plotly plotly-python
1个回答
0
投票

没有正在运行的代码段和示例数据,给出合适的建议并不容易。但是对于在x轴上具有日期的类似情况,我通常使用这种方法:

代码段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:

enter image description here

现在您可以将tickvals = df_tips['date'][0::40]更改为tickvals = df_tips['date'][0::80]并获得:

图2:

plot2

那么,为什么这第一次对您不起作用?多种原因:

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

我该如何解决?

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

我知道y=y.y看上去很[怪异,但我只是这样想,是为了友好地提醒您,让熊猫系列或数据框的名称比像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()
© www.soinside.com 2019 - 2024. All rights reserved.