Plotly: как настроить метки xaxis, используя plotly express? - PullRequest
0 голосов
/ 06 января 2020

Я пытаюсь отобразить горизонтальную гистограмму с датами на оси x, но не могу представить, что это можно сделать, хотя значения x являются датами типа string. Как вы можете видеть ниже, числа, которые встречаются в виде меток, должны быть некоторой суммой, но я точно не знаю, что именно. Как изменить приведенный ниже пример, чтобы получить даты в виде тиклабели?

Сюжет 1:

enter image description here

Код:

# 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:

То же, что и раньше:

enter image description here

Попытка 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:

enter image description here

Все еще удивительно бесполезно, но теперь тики по крайней мере выглядят как даты, хотя мы смотрим на значение, которое представляет временную метку в 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 :

Судя по всему, это точно что я ищу:

enter image description here

Но это в равной степени бесполезно, как и другие попытки, поскольку у нас есть для указания tickvals= [2050, 2100, 2150, 2200]. Если мы изменим период, эти значения придется переопределить, и это не очень гибко. Конечно, если бы мы каким-то образом могли извлечь значения тиков по умолчанию, используемые плоттером, мы могли бы легко заменить их датами в наборе данных. Но это все еще невозможно в соответствии с ответом на пост Plotly: Как получить значения для основных тиков и линий сетки?

Я в полной растерянности и сбит с толку бесполезность моих попыток, поэтому любые другие предложения будут великолепны!

1 Ответ

0 голосов
/ 08 апреля 2020

Вы должны активировать tickmode в 'массив', а затем определить tickvals и ticktext, например:

tickmode = 'array',
tickvals = [2050, 2100, 2150, 2200],
ticktext = df['date'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...