Plotly: Как отформатировать дату в hoverinfo при использовании строки plotly express? - PullRequest
1 голос
/ 27 апреля 2020

Я использую следующий код для отображения данных временных рядов, используя график express line.

fig = px.line(df, x="date", y="close", color="type" ,category_orders = co ,color_discrete_sequence = colors,
              line_group="type", title = company)

fig.update_layout(height=500, width=1500)#hovermode="x unified"
fig.show()

Но на графике при наведении курсора отображается дата в формате: «Месяц, Год», т.е. не отображает день. Но я хочу, чтобы даты отображались в следующем формате: «День месяца, год».

1 Ответ

1 голос
/ 27 апреля 2020

Вы можете сделать это, используя правильную комбинацию text и hovertemplate in:

for ser in fig['data']:
    ser['text']=list(set([d.strftime('%Y-%m-%d') for d in df['dates']]))
    ser['hovertemplate']='category=open<br>dates=%{text}<br>price=%{y}<extra></extra>'
fig.show()

Причина, по которой ser ['text'] настолько запутана, заключается в том, что в результате на рисунке отображается уникальные даты на оси х. И, поскольку plotly.express работает с полными или длинными, а не широкими данными , столбец, содержащий ваши даты в наборе данных, скорее всего, не будет иметь уникальные значения даты.

Вот пример, основанный на некоторых данных финансовых временных рядов с различными категориями, что идеально подходит для px.line:

enter image description here

Полный код с образцами данных:

# imports
import pandas as pd
import plotly.graph_objects as go
from datetime import datetime
import plotly.express as px

# data
open_data = [33.0, 33.3, 33.5, 33.0, 34.1]
high_data = [33.1, 33.3, 33.6, 33.2, 34.8]
low_data = [32.7, 32.7, 32.8, 32.6, 32.8]
close_data = [33.0, 32.9, 33.3, 33.1, 33.1]
dates = [datetime(year=2020, month=10, day=10),
         datetime(year=2020, month=10, day=11),
         datetime(year=2020, month=10, day=12),
         datetime(year=2020, month=10, day=13),
         datetime(year=2020, month=10, day=14)]

# data organized in a pandas dataframe
df=pd.DataFrame(dict(open=open_data,
                    high=high_data,
                    low=low_data,
                    close=close_data,
                    dates=dates))

# transform the data from wide to long
df = pd.melt(df, id_vars=['dates'], value_vars=df.columns[:-1],
         var_name='category', value_name = 'price')

# setup for a perfect plotly time series figure
fig = px.line(df, x="dates", y="price", title='Prices', color = 'category')

# edit text and hovertemplate
for ser in fig['data']:
    ser['text']=list(set([d.strftime('%Y-%m-%d') for d in df['dates']]))
    ser['hovertemplate']='category=open<br>dates=%{text}<br>price=%{y}<extra></extra>'

fig.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...