Plotly:如何使用 plotly express 自定义 xaxis 刻度标签?

Posted

技术标签:

【中文标题】Plotly:如何使用 plotly express 自定义 xaxis 刻度标签?【英文标题】:Plotly: How to customize xaxis tick labels using plotly express? 【发布时间】:2020-04-24 09:20:43 【问题描述】:

我正在尝试在 x 轴上显示带有日期的水平条形图,但似乎无法做到这一点,尽管 x 值是字符串类型的日期。正如您在下面看到的,作为刻度标签出现的数字必须是某种总和,但我不确定到底是什么。如何更改下面的示例以获取日期作为刻度标签?

情节 1:

代码:

# imports
import numpy as np
import pandas as pd
import plotly.express as px
from datetime import datetime

# data
np.random.seed(1)
cols=list('ABCDE')
df = pd.DataFrame(np.random.randint(0,2,size=(5, len(cols))), columns=cols)
drng=pd.date_range(datetime(2020, 1, 1).strftime('%Y-%m-%d'), periods=df.shape[0]).tolist()
df['date']=[d.strftime('%Y-%m-%d') for d in drng]
dfm=pd.melt(df, id_vars=['date'], value_vars=df.columns[:-1])

# plotly express
fig = px.bar(dfm, x="date", y="variable", color='value', orientation='h',
             hover_data=["date"],
             height=400,
             color_continuous_scale=['blue', 'teal'],
             title='Custom date ticklabels for vertical bar plot',
             template='plotly_white',
            )

fig.update_traces(showlegend=False)
fig.update(layout_coloraxis_showscale=False)
fig.show()

我的尝试:

我在fig.update_layout 中为xaxis=dict() 尝试了tickmodetickvalsticktext 的不同组合,唉,结果完全没用。

尝试 2: ticktext

设置tickvals=df['date']

fig.update_layout(yaxis=dict(title=''),
                  xaxis=dict(title='',
                  gridcolor='grey',
                  #tickmode= 'array',
                  #tickmode= 'linear',
                  #tick0= 2220,
                  #dtick=200,
                  #tickvals= [2020, 2040],
                  ticktext = df['date'])
                 )

情节2:

和以前一样:

尝试 3: ticktext & dtick

令我惊讶的是,将dtick 设置为某个任意值会为您提供下图。

fig.update_layout(yaxis=dict(title=''),
                  xaxis=dict(title='',
                  gridcolor='grey',
                  #tickmode= 'array',
                  #tickmode= 'linear',
                  tick0= 2050,
                  dtick=2,
                  #tickvals= [2020, 2040],
                  ticktext = df['date'])
                 )

情节 3:

仍然令人惊讶地没用,但现在刻度至少看起来像日期,尽管我们正在查看一个表示 2008 中的时间戳的值并且源数据是 2020...

尝试 4: tickvalsticktext

fig.update_layout(yaxis=dict(title=''),
                  xaxis=dict(title='',
                  gridcolor='grey',
                  #tickmode= 'array',
                  #tickmode= 'linear',
                  tick0= 2050,
                  #dtick=2,
                  tickvals= [2050, 2100, 2150, 2200],
                  ticktext = df['date'])
                 )

情节 4:

从 if 的外观来看,这正是我正在寻找的:

但这与其他尝试一样无用,因为我们指定tickvals= [2050, 2100, 2150, 2200]。如果我们更改周期,则必须重新指定这些值,这不是很灵活。当然,如果我们能以某种方式检索 plotly 使用的默认刻度值,我们可以轻松地将它们替换为数据集中的日期。但是根据Plotly: How to retrieve values for major ticks and gridlines?@ 帖子的回答,这似乎仍然是不可能的

我在这里完全不知所措,并且对我的尝试毫无用处感到困惑,所以任何其他建议都会很棒!

【问题讨论】:

我对你在这里想要做什么感到困惑......你称之为“垂直条形图”虽然orientation设置为h并且x值为日期。 将条形图的长度指定为日期有点令人担忧:没有明显的零!在这种情况下,条形图从1970-01-01(Unix 纪元的开始)开始,然后根据增量水平添加,因此第一个条形图到2020-01-01(50 年的持续时间),第二个条形图大约是同样的,它又过了 50 年到 2070 年,第三个到 2120 年等等。这就是为什么你的刻度显示为 2050 年、2100 年等等。 啊,我明白了,您正在尝试回答 ***.com/questions/59602653/… ... 是的,要做到这一点,您可能需要设置每个栏的 base你'必须将每个条形的 x 值设为对应于 1970-01-01T00:00:00 + 您希望条形长度为的时间跨度的日期。粗俗但真实。 你也可以考虑使用plot.ly/python/gantt 这里的另一种方法是使用带有开始和结束日期的非常粗的线段... 【参考方案1】:

您必须将tickmode 激活为“数组”,然后定义tickvalsticktext,例如:

tickmode = 'array',
tickvals = [2050, 2100, 2150, 2200],
ticktext = df['date'])

【讨论】:

以上是关于Plotly:如何使用 plotly express 自定义 xaxis 刻度标签?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 R 的 plotly 包中使用 plotly 函数?

如何使用 Plotly Express 和 Plotly 隐藏图例

Plotly:如何使用 plotly express 在单迹散点图中显示图例?

Plotly:如何使用 plotly express 自定义 xaxis 刻度标签?

Plotly:使用 plotly express 行时如何在 hoverinfo 中格式化日期?

Plotly:如何使用 plotly.graph_objects 将两个 3D 图放在同一个图上?