Plotly:如何设置自定义 xticks

Posted

技术标签:

【中文标题】Plotly:如何设置自定义 xticks【英文标题】:Plotly: How to set custom xticks 【发布时间】:2020-09-03 18:54:37 【问题描述】:

来自plotly doc:

布局 > xaxis > tickvals:

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

布局 > 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()

结果:

由于 x_dates[::2] 的长度是 50 ,所以 ticknumber 根本不匹配。 怎么解决??

【问题讨论】:

我不确定这个问题的意图是什么,但您是说每 100 条数据需要 50 个 x 轴标签吗? @r-beginners 我只想设置 costom xticks 。我知道nticks 在这种情况下可以做类似的事情,但问题是为什么tickmode="array" 不起作用。 您正在创建一个layout dict。但是您没有将其传递给 fig 对象。 【参考方案1】:

我通常使用以下方法。您应该知道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])

情节 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 将日期作为索引,因此将 y.index 设置为 x 轴值。 y.index 返回日期 当您通过fig.update_xaxes(tickvals) 设置刻度标记位置 时,使用整数 值效果更好。

我做了什么来修复它?

    我在重采样后重置了索引,这样y.index 就不会返回日期。 将 y 更改为使用 .to_frame 的数据框。 已更改为 fig.add_trace(go.Scatter(x=y.index, y=y.y)),否则会失败,因为现在这是一个数据帧,而不是一个系列。 您的日期现在检索为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()

【讨论】:

很奇怪,您的代码在我的环境中是正确的,我的代码仍然显示错误的 xticks,您可以运行我的代码进行测试吗? 将整数值输入到xtickvals,这是正确的点。我没有尝试过这个,因为类似的代码在 matplotlib 中工作。因此,在处理 dtype 'x' : date, tickvals: int 和 dtype 'x' : date, tickvals: date 时,看起来情节有些问题,后来一个也没有用,所以我没有尝试 'x' : int, tickvals: int 。我想我会去打扰那些阴谋开发者:)。感谢您指出这一点。

以上是关于Plotly:如何设置自定义 xticks的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Plotly 中添加跟踪,并为沿 x 轴的每个数据点设置自定义顺序?

如何自定义 Plotly/R/ggplot2 动画断点(帧间距、持续时间)

Plotly:如何为所有子图设置 xticks?

matplotlib自定义横轴信息xticks

matplotlib自定义横轴信息xticks

如何使用 plotly 自定义平行类别图颜色? Python版