11

I receive an ValueError: min() arg is an empty sequence when trying to convert a pandas dataframe plot to plotly.

Here is a sample of the dataframe (with NaNs):

ttab.loc[:,:"Irish"]

Group   English (British)   Americans (White)   Canadians   Scots   Irish
Year                    
1926    1   2   3   4   5
1946    3   1   2   5   4
1956    3   1   2   7   5
1966    2   1   3   9   5
1977    2   1   3   9   7
1993    2   NaN NaN 6   1
2001    4   1   3   NaN 5
2001*   4   1   3   NaN 5
2012    4   1   3   NaN 6

I make a pretty plot:

# Time It
import time
begin = time.clock()

# Inline plotting
%matplotlib inline

# Import libraries
import matplotlib
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
from pandas.tools.plotting import scatter_matrix

# (*) To communicate with Plotly's server, sign in with credentials file
import plotly.plotly as py
# (*) Useful Python/Plotly tools
import plotly.tools as tls
# (*) Graph objects to piece together plots
from plotly.graph_objs import *

# Read, clean, slice data here...
# Rename columns, examine, rename groups here...
# Merge, set index, transpose dataframe here....
# Change datatype to float here...
# Define color palette here...
# Now Plot...

# Package all mpl plotting commands inside one function
def plot_mpl_fig():

    # plot parameters
    figsize = (12,12)
    axfontsize = 16
    legfontsize = 14
    labfontsize = 18
    yax = (30,0)
    lw = 2

    # Interpolate NaNs and plot as dashed lines
    ax = ttab.loc[:,:'Asian Indians'].interpolate().plot(color=colorlist, ylim=yax, lw=lw, fontsize=axfontsize, \
                                                     figsize=figsize, style='--')

    # Overplot the measured values with solid lines
    ttab.loc[:,:'Asian Indians'].plot(ax=ax, color=colorlist, ylim=yax, lw=lw, fontsize=axfontsize, figsize=figsize)

    # Legend handling
    lines, labels = ax.get_legend_handles_labels()
    ax.legend(lines[28:], labels[28:], loc='center left', bbox_to_anchor=(-0.3, 0.5), fontsize=legfontsize)

    # Labeling
    plt.xlabel('Year',fontsize=labfontsize)
    plt.ylabel('Rank',fontsize=labfontsize)

# Plot it!
plot_mpl_fig()

# N.B. get matplotlib figure object and assign a variable to it
mpl_fig1 = plt.figure()

And then I try to convert by following the example at: https://plot.ly/python/matplotlib-to-plotly-tutorial/

Quickstart:

>>> import plotly.plotly as py
>>> import matplotlib.pyplot as plt
>>> # auto sign-in with credentials or use py.sign_in()
>>> mpl_fig_obj= plt.figure()
>>> # ... make a matplotlib figure ...
>>> py.plot_mpl(mpl_fig1)                                  # <== ValueError

Or Tutorial at Section 6.1:

# Convert a matplotlib figure object to a Plotly figure object
help(tls.mpl_to_plotly)
py_fig1 = tls.mpl_to_plotly(mpl_fig1, verbose=True)         # <== ValueError
print(py_fig1.to_string())
# Plot a matplotlib figure in Plotly
help(py.iplot_mpl) 
py.iplot_mpl(mpl_fig1, filename='s6_damped_oscillation')    # <== ValueError

Anytime I call plot_mpl, mpl_to_plotly, or iplot_mpl I get the ValueError: min() arg is an empty sequence. I think it might have to do with the NaNs, but I don't know how to work around that. Any suggestions?

2
  • Can you post the full stack trace? Thanks. Commented Oct 6, 2015 at 21:16
  • 1
    I was having the same problem, but I got a workaround doing something like this. If you need more customizations, you can read here. Commented Oct 8, 2015 at 23:32

2 Answers 2

1

It looks like mpl_to_plotly requires using axes.plot(), not plt.plot(). The following code works in a Jupyter Notebook.

import plotly.offline as py
from plotly.offline import init_notebook_mode, iplot
import plotly.tools as tls
import matplotlib.pylab as plt
from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas

init_notebook_mode(connected=True)
fig = plt.Figure()
ax = fig.gca()
x = [-2,0,4,6,7]
y = [q**2-q+3 for q in x]
ax.plot(x,y)
canvas = FigureCanvas(fig)
plotly_fig = tls.mpl_to_plotly(fig)
py.iplot(plotly_fig)
Sign up to request clarification or add additional context in comments.

Comments

0

If anyone else is coming across this, mpl_to_plotly is now deprecated because of a change in the Matplotlib package. I believe that you will have to find a workaround for this function. Fortunately, Plotly has built-in functions to do most of what Matplotlib does. https://github.com/plotly/plotly.py/issues/1568

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.