Plotly:如何设置自定义 xticks

编程入门 行业动态 更新时间:2024-10-09 17:30:57
本文介绍了Plotly:如何设置自定义 xticks的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

来自

由于 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:

    layout > xaxis > tickvals:

    Sets the values at which ticks on this axis appear. Only has an effect if tickmode is set to "array". Used with ticktext.

    layout > xaxis > ticktext:

    Sets the text displayed at the ticks position via tickvals. Only has an effect if tickmode is set to "array". Used with tickvals.

    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

    本文发布于:2023-07-19 13:46:36,感谢您对本站的认可!
    本文链接:https://www.elefans.com/category/jswz/34/1157106.html
    版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
    本文标签:自定义   如何设置   Plotly   xticks

    发布评论

    评论列表 (有 0 条评论)
    草根站长

    >www.elefans.com

    编程频道|电子爱好者 - 技术资讯及电子产品介绍!