plotly.py
plotly.py copied to clipboard
mplexporter not getting Collection offset position due to matplotlib API changes in v3.5
Using plotly 5.6.0 and matplotlib 3.5.1
Collection.set_offset_position and Collection.get_offset_position have been removed; the offset_position of the Collection class is now "screen"
Example code to reproduce the problem:
import numpy as np
from matplotlib import pyplot as plt
from plotly import tools
x = np.arange(10)
y = x **2.
fig1 = plt.figure(1)
plt.vlines(x, 0, max(y))
tools.mpl_to_plotly(fig1)
gives
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Users\------\AppData\Local\Programs\Python\Python310\lib\site-packages\plotly\tools.py", line 112, in mpl_to_plotly
matplotlylib.Exporter(renderer).run(fig)
File "C:\Users\------\AppData\Local\Programs\Python\Python310\lib\site-packages\plotly\matplotlylib\mplexporter\exporter.py", line 53, in run
self.crawl_fig(fig)
File "C:\Users\------\AppData\Local\Programs\Python\Python310\lib\site-packages\plotly\matplotlylib\mplexporter\exporter.py", line 124, in crawl_fig
self.crawl_ax(ax)
File "C:\Users\------\AppData\Local\Programs\Python\Python310\lib\site-packages\plotly\matplotlylib\mplexporter\exporter.py", line 146, in crawl_ax
self.draw_collection(ax, collection)
File "C:\Users\------\AppData\Local\Programs\Python\Python310\lib\site-packages\plotly\matplotlylib\mplexporter\exporter.py", line 289, in draw_collection
offset_order = offset_dict[collection.get_offset_position()]
AttributeError: 'LineCollection' object has no attribute 'get_offset_position'. Did you mean: '_offset_position'?
facing similar issue with
plotly==5.4.0
matplotlib==3.5.0
it seems the reason is plolty uses deprecated API which was dropped in mpl 3.5.0:
https://matplotlib.org/3.5.1/api/prev_api_changes/api_changes_3.5.0.html#removals
@cylammarco are you waiting for the fix or you managed to find some sort of workaround here?
@alberttorosyan Speaking out loud, it should be a simple fix that requires changes in a few lines at:
https://github.com/plotly/plotly.py/blob/4b5392221bd71d5fa338bfc2144a2fcf3451c177/packages/python/plotly/plotly/matplotlylib/mplexporter/exporter.py#L289-L300
However, Plotly doesn't have a development/contribution guide, I don't know how they would like to handle this kind of deprecation. any thoughts?
@cylammarco thinking the same here...
It is possible to apply runtime patch until this gets fixed, but I don't love much the idea of using unittest module in production code
seems like it isn't as straightforward as I thought:
plotly.py\packages\python\plotly\plotly\matplotlylib\renderer.py:574: UserWarning:
Dang! That path collection is out of this world. I totally don't know what to do with it yet! Plotly can only import path collections linked to 'data' coordinates
the mplexporter cannot grab the 'data' post-v3.5
we finally moved away from this.
as an alternative, converting matplotlib figures to image is used in places where interactions (zoom in/out etc.) are not critical.
@alberttorosyan Speaking out loud, it should be a simple fix that requires changes in a few lines at:
https://github.com/plotly/plotly.py/blob/4b5392221bd71d5fa338bfc2144a2fcf3451c177/packages/python/plotly/plotly/matplotlylib/mplexporter/exporter.py#L289-L300
However, Plotly doesn't have a development/contribution guide, I don't know how they would like to handle this kind of deprecation. any thoughts?
I'm not using Plotly directly but mplleaflet and I got the same error. I managed to make it work by replacing in this exporter.py file
offset_order = offset_dict[collection.get_offset_position()]
by
offset_order = offset_dict[collection._offset_position]
Hope it helps someone!
@alberttorosyan Speaking out loud, it should be a simple fix that requires changes in a few lines at: https://github.com/plotly/plotly.py/blob/4b5392221bd71d5fa338bfc2144a2fcf3451c177/packages/python/plotly/plotly/matplotlylib/mplexporter/exporter.py#L289-L300
However, Plotly doesn't have a development/contribution guide, I don't know how they would like to handle this kind of deprecation. any thoughts?
I'm not using Plotly directly but mplleaflet and I got the same error. I managed to make it work by replacing in this exporter.py file
offset_order = offset_dict[collection.get_offset_position()]byoffset_order = offset_dict[collection._offset_position]Hope it helps someone!
I tried it. Expected renko plot however I only got the bar chart.
fig, ax = mpl.plot(data, type="renko", style='yahoo', figsize=(15,10), returnfig=True, volume=True)
plotly_fig = tls.mpl_to_plotly(fig)
st.plotly_chart(plotly_fig, use_container_width=True)

any update here? Are we stuck with using matplotlib 3.4?
@SiddhantSadangi I have not done anything against this issue :|
https://github.com/plotly/plotly.py/issues/3624#issuecomment-1161805210 is probably the best solution at the moment(?).
#3624 (comment) is probably the best solution at the moment(?).
This unfortunately won't work in our case as we use github actions :(
Is there a way that I can help? This issue is now a year and a half old. This behavior breaks Weights and Balances's use of Matplotlib.
Fixed in #4372 (thanks @NeilGirdhar 🙇 ), I expect we'll release next week with the next plotly.js minor.