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()
尝试了tickmode
、tickvals
和ticktext
的不同组合,唉,结果完全没用。
尝试 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: tickvals
和 ticktext
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
激活为“数组”,然后定义tickvals
和ticktext
,例如:
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 刻度标签?