plotly / plotly/plotly.py

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

Offen
#4,278 2 Kommentare 3 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

feature P3
Vorherrschende Sprache
Python
Sterne
18.8k
Forks
2.8k
Ø Merge
16 Std. 26 Min.
Gemergte PRs (30 T.)
21

Beschreibung

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

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginnen Sie mit der Prüfung der Python-Beispiele des Issues sowie des bestehenden Verhaltens von axis ticktext, tickvals, hovertext und unified-hover in plotly.py. Es werden keine Quelldateien oder Tests genannt. Identifizieren Sie daher zunächst die relevanten Einstiegsstellen für Achsen und Hover, bevor Sie entscheiden, ob die Änderung in plotly.py oder in der zugrunde liegenden Plotting-Schicht vorgenommen werden sollte. Erledigt bedeutet, dass separater hover-axis text mit hovermode='x unified' funktioniert, während die Achsen-Tick-Beschriftungen unverändert bleiben, und dass der demonstrierte Fall durch Tests abgedeckt ist.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
python
Bereich
data-visualization
Issue-Typ
Feature
Schwierigkeit
5/5
Geschätzter Aufwand
Über eine Woche
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
35/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.