Я пытаюсь отобразить горизонтальную гистограмму с датами на оси x, но не могу представить, что это можно сделать, хотя значения x являются датами типа string. Как вы можете видеть ниже, числа, которые встречаются в виде меток, должны быть некоторой суммой, но я точно не знаю, что именно. Как изменить приведенный ниже пример, чтобы получить даты в виде тиклабели?
Сюжет 1:
Код:
# imports
import numpy as np
import pandas as pd
import plotly.express as px
# 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(pd.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()
Что я пробовал:
Я пробовал разные комбинации для tickmode
, tickvals
и ticktext
для xaxis=dict()
в fig.update_layout
, увы, с совершенно бесполезными результатами.
Попытка 2: ticktext
Set 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 :
Судя по всему, это точно что я ищу:
Но это в равной степени бесполезно, как и другие попытки, поскольку у нас есть для указания tickvals= [2050, 2100, 2150, 2200]
. Если мы изменим период, эти значения придется переопределить, и это не очень гибко. Конечно, если бы мы каким-то образом могли извлечь значения тиков по умолчанию, используемые плоттером, мы могли бы легко заменить их датами в наборе данных. Но это все еще невозможно в соответствии с ответом на пост Plotly: Как получить значения для основных тиков и линий сетки?
Я в полной растерянности и сбит с толку бесполезность моих попыток, поэтому любые другие предложения будут великолепны!