plotly / plotly/plotly.py

enable display of different ticktext for hover and axis when using `hovermode='x unified'`

Abierto
#4,278 2 comentarios 3 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

feature P3
Lenguaje dominante
Python
Estrellas
18.8k
Forks
2.8k
Merge medio
16 h 26 min
PR fusionados (30 d)
21

Descripción

Hi,

Below you can read a feature request (given that this does not exist already).

The scenario

I am looking for a nice solution for displaying a hover "title" different from the ticks when using hovermode='x unified'.
Let's say that you want to display multiple time series and you have your range defined in 2 different ways. You have the timestamps, and the elapsed time. Now, you don't want to display both on the x axis to keep that clutter free, but you want to display them when hovering over the plot.

The problem

Take this code for example:

import plotly.graph_objects as go

x = ['2023-07-01', '2023-07-02', '2023-07-03', '2023-07-04']
y1 = [10, 15, 7, 12]
y2 = [5, 8, 10, 6]

ticktext = ['Day 1', 'Day 2', 'Day 3', 'Day 4']
tickvals = x  

hovertext = ['Hover 1', 'Hover 2', 'Hover 3', 'Hover 4']

fig = go.Figure()

fig.add_trace(go.Scatter(x=x, y=y1, hovertext=hovertext, name='Series 1'))
fig.add_trace(go.Scatter(x=x, y=y2, name='Series 2'))

fig.update_layout(xaxis=dict(
    tickmode='array',
    ticktext=ticktext,
    tickvals=tickvals
), 
    hovermode='x unified'
)

fig.show()

This will produce the following plot, and the problem is that I want to place "Hover 2" in place of "Day 2", while keeping "Day 2" on the x axis:

image

One solution

One solution I came up with was introducing a 2nd y axis, and placing the hover information there, hiding the axis and hiding the line. This works fine, however results in a hover display that looks "funny", essentially leaving some padding before the displayed text.

import plotly.graph_objects as go

x = ['2023-07-01', '2023-07-02', '2023-07-03', '2023-07-04']
y1 = [10, 15, 7, 12]
y2 = [5, 8, 10, 6]

ticktext = ['Day 1', 'Day 2', 'Day 3', 'Day 4']
tickvals = x  

hovertext = ['Hover 1', 'Hover 2', 'Hover 3', 'Hover 4']

fig = go.Figure()

fig.add_trace(go.Scatter(x=x,
                          y=y1,
                          text=hovertext,
                          yaxis='y2',
                          opacity=0,
                          showlegend=False,
                          hovertemplate = "%{text}<extra></extra>") )
fig.add_trace(go.Scatter(x=x, y=y1, hovertext=hovertext, name='Series 1', hovertemplate = "%{y:.1f}<extra></extra>"))
fig.add_trace(go.Scatter(x=x, y=y2, name='Series 2', hovertemplate = "%{y:.1f}<extra></extra>"))

fig.update_layout(xaxis=dict(
    tickmode='array',
    ticktext=ticktext,
    tickvals=tickvals
    ), 
    hovermode='x unified',
    yaxis2 = dict(
        overlaying='y',
        showticklabels=False
    ),
)

fig.show()

image

Proposed solution

It would be so amazing if one could just have a hoverticktext arg in the layout, that would allow for another piece of text to be set.

Imaginary example code with expected result:

import plotly.graph_objects as go

x = ['2023-07-01', '2023-07-02', '2023-07-03', '2023-07-04']
y1 = [10, 15, 7, 12]
y2 = [5, 8, 10, 6]

ticktext = ['Day 1', 'Day 2', 'Day 3', 'Day 4']
tickvals = x  

hovertext = ['Hover 1', 'Hover 2', 'Hover 3', 'Hover 4']

fig = go.Figure()

fig.add_trace(go.Scatter(x=x, y=y1, name='Series 1'))
fig.add_trace(go.Scatter(x=x, y=y2, name='Series 2'))

fig.update_layout(xaxis=dict(
    tickmode='array',
    ticktext=ticktext,
    tickvals=tickvals,
    hoverticktext = hovertext # added this imaginary line
), 
    hovermode='x unified'
)

fig.show()

And this would result in the following (edited picture) plot:

image

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Línea de trabajo

Empieza revisando los ejemplos de Python del issue y el comportamiento existente de axis ticktext, tickvals, hovertext y unified-hover en plotly.py. No se nombran archivos fuente ni tests, así que identifica los puntos de entrada relevantes de ejes y hover antes de decidir si el cambio corresponde a plotly.py o a su capa de plotting subyacente. Se considera terminado cuando el texto separado del eje de hover funciona con hovermode='x unified' mientras las etiquetas de los ticks del eje permanecen sin cambios, con cobertura para el caso demostrado.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
python
Área
data-visualization
Tipo de issue
Nueva funcionalidad
Dificultad
5/5
Tiempo estimado
Más de una semana
Estado de actividad
Estancado
Claridad
Bastante claro
Aptitud para principiantes
35/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.