plotly.py icon indicating copy to clipboard operation
plotly.py copied to clipboard

Write Image as PDF with Box saying "Loading [MathJax]/extensions/MathMenu.js"

Open vincentliuheyang opened this issue 4 years ago • 23 comments

Hi,

截屏2021-11-15 下午4 34 46

I am trying to write plot into PDF format, but I cannot get rid of this box saying "Loading [MathJax]/extensions/MathMenu.js", will you be able to tell me how should I fix it?

Here is the code I am using to generate the plot.

fig = go.Figure()
    fig.add_trace(go.Scatter(x=[0, 1, 2, 3, 4, 5], y=[0.5, 0.6, 0.7, 0.8, 0.9, 0.9], name='A',
                             line=dict(width=4), marker=dict(size=15, symbol='star')))
    fig.add_trace(go.Scatter(x=[0, 1, 2, 3, 4, 5], y=[0.4, 0.4, 0.4, 0.4, 0.4, 0.4], name='B',
                             line=dict(width=4), marker=dict(size=15, symbol='circle')))
    fig.add_trace(
        go.Scatter(x=[0, 1, 2, 3, 4, 5], y=[0.51, 0.52, 0.53, 0.54, 0.55, 0.56], name='C',
                   line=dict(width=4), marker=dict(size=15, symbol='x')))

    fig.update_layout(
        yaxis_range=[0.2, 1],
        legend=dict(
            x=0,
            y=0,
            traceorder="reversed",
            title_font_family="Times New Roman",
            font=dict(
                family="Courier",
                size=16,
                color="black"
            ),
            bgcolor="LightSteelBlue",
            bordercolor="Black",
            borderwidth=2
        )
    )
    fig.write_image("1.pdf")
    fig.show()

vincentliuheyang avatar Nov 15 '21 08:11 vincentliuheyang

What Plotly version are you running? I checked your code with v 5.3.1 (the last one), and no such box is displayed.

empet avatar Nov 15 '21 11:11 empet

I am getting the same box in PDF outputs with Plotly Version 5.3.1 image

kuppu avatar Nov 15 '21 15:11 kuppu

I have no idea why that box is displayed. It could be your browser?!!!

empet avatar Nov 15 '21 16:11 empet

It only outputs such box if I am trying to write a PDF, the browser does not have such box. One peculiar issue is that if I am going to write multiple PDF plot in one file, this box will only show in the first PDF image.

vincentliuheyang avatar Nov 16 '21 01:11 vincentliuheyang

This is pretty unfortunate. The cause is that the PDF is being generated by a browser essentially doing a print operation. If this happens while MathJax is still loading, then this box will appear in the output. @jonmmease any thoughts about how to wait a bit longer?

nicolaskruchten avatar Nov 16 '21 02:11 nicolaskruchten

This is pretty unfortunate. The cause is that the PDF is being generated by a browser essentially doing a print operation. If this happens while MathJax is still loading, then this box will appear in the output. @jonmmease any thoughts about how to wait a bit longer?

Just for now, my solution is writing a random plot before my official plot. Of course, I would like to see this problem resolved if possible.

vincentliuheyang avatar Nov 16 '21 02:11 vincentliuheyang

I am having the same issue with plotly 5.4.0 and kaleido 0.2.1.post1. I suspect the issue is with the latest kaleido.

stansotn avatar Nov 16 '21 20:11 stansotn

I'm also running into this with:

plotly==5.4.0
plotly-express==0.4.1
kaleido==0.2.1

Thanks for the workaround @vincentliuheyang, it works well for me.

willfindlay avatar Dec 05 '21 19:12 willfindlay

Same issue with exact same versions as @willfindlay. Is there any workaround?

jlehrer1 avatar Dec 13 '21 21:12 jlehrer1

Thanks to @vincentliuheyang. @jlehrer1 Try something like this :-) :

import plotly.express as px

#garbage graph
fig = px.scatter(x=[0, 1, 2, 3, 4], y=[0, 1, 4, 9, 16])
fig.show()
fig.write_image("random.pdf")

#actual graph to be replaced
fig1 = px.scatter(x=[0, 1, 2, 3, 4], y=[0, 1, 4, 9, 16])
fig1.show()
fig1.write_image("random.pdf")

tahashmi avatar Dec 14 '21 12:12 tahashmi

this worked for me:

figure="some_figure.pdf"
fig=px.scatter(x=[0, 1, 2, 3, 4], y=[0, 1, 4, 9, 16])
fig.write_image(figure, format="pdf")
time.sleep(2)

fig=make_figure(df,pa)
fig.write_image(figure, format="pdf")

plotly==5.3.1

jorgeboucas avatar Dec 14 '21 13:12 jorgeboucas

Thank you! I hadn't realized it was only on the first write when running a script. Interesting.

jlehrer1 avatar Dec 14 '21 16:12 jlehrer1

I am experiencing the same problem as well, do we know what causes the problem?

eric-vader avatar Dec 15 '21 09:12 eric-vader

Yes, we know the basic cause, see https://github.com/plotly/Kaleido/issues/122 for details.

Note that if the figure you're rendering doesn't actually use MathJax then you can prevent MathJax from being loaded at all by Kaleido with:

import plotly.io as pio   
pio.kaleido.scope.mathjax = None

Otherwise, if saving a "throwaway" PDF first helps, I would recommend that: basically save your figure twice.

nicolaskruchten avatar Dec 15 '21 15:12 nicolaskruchten

Is anyone seeing this with Kaleido 0.1 ?

nicolaskruchten avatar Dec 15 '21 15:12 nicolaskruchten

I have tried to manually downgrade to kaleido 0.1 and plot my graph and the error still exist.

eric-vader avatar Dec 15 '21 17:12 eric-vader

An easy way around is to save as .svg and then export it as .pdf using Inkscape.

Willtl avatar Jan 25 '22 11:01 Willtl

I have found a solution for that problem, at leas in my case it worked. Just disable the warnings on kaleido engine like this:

import plotly.io as pio

pio.full_figure_for_development(fig, warn=False)
fig.write_image("fig1.pdf",engine="kaleido")

pgvaz avatar Mar 29 '22 11:03 pgvaz

@pgvaz its probably pure luck that the message is not appearing in this case for you. When you look at the code of what you are calling here, the warn doesn't do anything but surpressing a plotly warning message that tells you you shouldn't use that function in production. This function simply parses invalid stuff out from your figure and returns a new figure. Since you are not doing anything with the return value this call has no impact.

https://github.com/plotly/plotly.py/blob/49dfcb1868e87627f032731ef2ac48e37891baf4/packages/python/plotly/plotly/io/_kaleido.py

bgottschall avatar Dec 09 '22 08:12 bgottschall

Saving a dummy figure before the desired figure doesn't work for me. What browser does Plotly use by default for PDF saving? Could it be a browser-dependent issue?

theo-brown avatar May 23 '23 10:05 theo-brown

Saving a dummy figure before the desired figure doesn't work for me.

I think a time delay of a second may be necessary.

mjstahlberg avatar May 23 '23 16:05 mjstahlberg

Yes, we know the basic cause, see plotly/Kaleido#122 for details.

Note that if the figure you're rendering doesn't actually use MathJax then you can prevent MathJax from being loaded at all by Kaleido with:

import plotly.io as pio   
pio.kaleido.scope.mathjax = None

Otherwise, if saving a "throwaway" PDF first helps, I would recommend that: basically save your figure twice.

Hi, I tried but it did remove the watermark, but fails to render the math any more. I need the math formula to be shown, what can I do now? @nicolaskruchten

zhimin-z avatar Aug 27 '23 18:08 zhimin-z

I am having the same issue, I have tried in Windows 10, WSL and Ubuntu... I am using the most recent versions of the libraries. An option could be to export to svg and then convert with inkscape (I tried with cairosvg and it does not render the mathjax). Any updates or alternatives?

Fratorhe avatar Feb 02 '24 04:02 Fratorhe