plotly / plotly.py

The interactive graphing library for Python :sparkles: This project now includes Plotly Express!
https://plotly.com/python/
MIT License
16.17k stars 2.54k forks source link

enable multiple hover boxes for overlapping/multiple points #2476

Open johann-petrak opened 4 years ago

johann-petrak commented 4 years ago

This has been tested in version 4.7.1.

When hover information is shown for points e.g. in a scatter plot, the following situations can occur:

Hover information for all those multiple points should be shown, especially in cases where the hover information includes additional data not shown directly in the graph.

The hvPlot library does this correctly: it shows stacked hover boxes for all the data points under the cursor. Plotly only shows one hover box and it is not clear which one.

I think this is an actual bug since it makes it easy to miss data and the hover information does not represent the actual data in the graph.

Here is an example using the Iris data set and Plotly:

import plotly.express as px
from bokeh.sampledata import iris
df = iris.flowers.copy()
fig = px.scatter(df, x="sepal_length", y="sepal_width", color="species",
                 opacity=0.4, hover_data=["petal_length", "petal_width"]
                )
fig.show()

This shows: plotly01

With hvPlot:

df.hvplot(kind="scatter", 
          x="sepal_length", y="sepal_width", by="species", 
          hover_cols=["petal_length", "petal_width"], 
          alpha=0.4)

Hvplot01

nicolaskruchten commented 4 years ago

I agree that we should have an additional hover mode for this behaviour but the current behaviour is not considered a bug at this time :)

johann-petrak commented 4 years ago

My concern is that showing a single random data point when there are many can lead to serious misinterpretation, especially when one is used to a library like hvPlot which does show all the data points. One of the main purposes of visualizations and graphs is to learn about and understand data and I think all packages have to be very careful about how they do that. So if the current behaviour is not considered a bug, it should at least be clearly documented and explained wherever it could be important.

But having a mode to actually display

Currently I would personally need some kind of workaround, so anything that would help to implement an equivalent functionality would be tremendously helpful. All I can see at the moment is processing the data myself to calculate a list of data points per distinct coordinate and then use code and a custom hover template to do it all in code, but that is pretty inconvenient in comparison to just using hvPlot which just does it :)

nicolaskruchten commented 4 years ago

Like I said, I agree :)

As far as I know it’s not a random point we display the hover label for, it’s the last one drawn which is the latest one in the trace IIRC.

johann-petrak commented 4 years ago

I guess the proper workaround/fix for this also depends on the rendering mode? Is the main route to fixing this maybe through plotly.js?

nicolaskruchten commented 4 years ago

Yes, this would be a feature we would need to add in the Javascript library that powers Plotly.py. It's been brought up in the past here: https://github.com/plotly/plotly.js/issues/4294

nicolaskruchten commented 4 years ago

See also https://github.com/plotly/plotly.js/issues/4999

fern35 commented 4 years ago

having the same problem. When can we expect this feature to come out ?

nicolaskruchten commented 4 years ago

It's a good feature and we'd love to have it in the library but it's not on anyone's roadmap at the moment as far as I know. That said, we as maintainers would be happy to help someone from the community to implement it in Plotly.js, or to accept sponsorship to get it on to our short-term roadmap :)

fern35 commented 4 years ago

ok great, thx for the information!

massiIE commented 2 years ago

Any updates?

BeanRepo commented 2 years ago

It would be great to add this feature

keithgmitchell commented 1 year ago

Yeah its odd this hasnt been added. It should be relatively straighforward...

theoturner commented 1 year ago

Another bump hoping this is put on the roadmap - this seems like a very common occurrence for any type of plot.

ChrisBeirne commented 1 year ago

I would love this feature also - this happens all the time with real data!

mrvalbass commented 1 year ago

Same here, would be really great to have this feature for users not to lose information when using the graph

minkyokim19 commented 1 year ago

I would also really like this feature! Especially for mapping with Plotly.

blamson commented 4 months ago

Currently running into a situation where this would be a super nice feature. It's quite common that the data I'm working with overlaps on x,y and the data is small and discrete enough that adding jitter to resolve this wouldn't be appropriate.

slb534 commented 3 months ago

I also had this problem. As a workaround, I introduced jitter. I couldn't get it working with plot_ly, but, thankfully I succeeded with ggplotly.

I know this question was asked regareding Python; I'm using R but it's the exact same problem. Here is my solution in R, hopefully it helps someone if it could be translated to Python!

Below are screenshots of the result, one with jitter and one without. You can see without jitter it is very grid-like, and the opacity/alpha of the dots is darker where there are overlaps. On the jitter version you can actually see all the dots, even though their location is no longer precise. Tradeoffs, eh!!

ggplotly(
  ggplot(iris, 
         aes(x= Sepal.Length, 
             y= Sepal.Width,
             text = paste("Petal Length: ", Petal.Length, "Petal Width: ", Petal.Width, sep="")
         ) 
  ) +  
  geom_point(position="jitter", size=1,color="darkgreen", alpha=0.5) 
)
ggplotly-jitter ggplotly-nojitter