ScottieB
ScottieB

Reputation: 4052

Multiple series in a trace for plotly

I dynamically generate a pandas dataframe where columns are months, index is day-of-month, and values are cumulative revenue. This is fairly easy, b/c it just pivots a dataframe that is month/dom/rev.

But now I want to plot it in plotly. Since every month the columns will expand, I don't want to manually add a trace per month. But I can't seem to have a single trace incorporate multiple columns. I could've sworn this was possible.

 revs = Scatter(
  x=df.index,
  y=[df['2016-Aug'], df['2016-Sep']],
  name=['rev', 'revvv'],
  mode='lines'
)
data=[revs]
fig = dict( data=data)
iplot(fig)

This generates an empty graph, no errors. Ideally I'd just pass df[df.columns] to y. Is this possible?

Upvotes: 1

Views: 2965

Answers (1)

Maximilian Peters
Maximilian Peters

Reputation: 31709

You were probably thinking about cufflinks. You can plot a whole dataframe with Plotly using the iplot function without data replication.

An alternative would be to use pandas.plot to get an matplotlib object which is then converted via plotly.tools.mpl_to_plotly and plotted. The whole procedure can be shortened to one line:

plotly.plotly.plot_mpl(df.plot().figure)

The output is virtually identical, just the legend needs tweaking.

import plotly
import pandas as pd
import random
import cufflinks as cf

data = plotly.tools.OrderedDict()
for month in ['2016-Aug', '2016-Sep']:
    data[month] = [random.randrange(i * 10, i * 100) for i in range(1, 30)]

#using cufflinks
df = pd.DataFrame(data, index=[i for i in range(1, 30)])
fig = df.iplot(asFigure=True, kind='scatter', filename='df.html')
plot_url = plotly.offline.plot(fig)
print(plot_url)

#using mpl_to_plotly
plot_url = plotly.offline.plot(plotly.tools.mpl_to_plotly(df.plot().figure))
print(plot_url)

enter image description here

Upvotes: 3

Related Questions