Python Forum

Full Version: [Plot a stacked bar graph using plotly offline mode]
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
I am following this link to study https://plot.ly/python/bar-charts/ plot graphs in python using plotly.

As per my requirement ,I have sample data of the form
data=[                                               
      ('2018-04-17','22:00:00',['p1',5],['p2',10],['p3',15]),
      ('2018-04-18','20:00:00',['p3',5],['p4',10],['p3',15])
     ]
So I want to create a stacked bar graph of this data using plotly. On X-axis,first two values of tuple will be plotted(date and time).

On y-axis , a stacked graph having three values with bar height in link with the value(which will be shown on mouse hover).As total 4 values are there in this data(p1,p2,p3,p4),four different colors will be used for them.

What I have tried : I basically tried hit and trial using the methods shown like take two data values using plotly offline graph object.But I am not able to draw it.

Can Anyone please provide suggestions for stacked histogram of these data.I have to view the generated file in browser and I am using plotly in offline mode.

What code I tried :
    import plotly
    import plotly.graph_objs as go

    plotly.offline.init_notebook_mode(connected=True)


    data=[                                               
          ('2018-04-17','22:00:00',['p1',5],['p2',10],['p3',15]),
          ('2018-04-18','20:00:00',['p3',5],['p4',10],['p3',15])
         ]


    x_axis=[]
    y_axis=[]
    plot_data=[]
    for d in data
        date,time=d[0],d[1]
        x_axis.append(d[0]+" "+d[1])
        for j in range (2, len(d))
            y_axis.append(d[j][1])

        trace[]=go.Bar(
                x=x_axis,
                y=y_axis)
        plot_data.append(trace)

    plotly.offline.plot(plot_data, filename='stacked-bar')
I succeed in plotting using below code :
import pandas as pd

all_data = [('2018-04-09', '10:18:11', ['s1',10],['s2',15],['s3',5]),
            ('2018-04-09', '10:20:11', ['s4',8], ['s2',20],['s1',10]),
            ('2018-04-10', '10:30:11', ['s4',10],['s5',6], ['s6',3]) ]

#load data into dataframe
df = pd.DataFrame(all_data, columns = list("ABCDE"))
#combine the two descriptors
df["day/time"] = df["A"] + "\n" + df["B"]
#assign each list to a new row with the appropriate day/time label
df = df.melt(id_vars = ["day/time"], value_vars = ["C", "D", "E"])
#split each list into category and value
df[["category", "val"]] = pd.DataFrame(df.value.values.tolist(), index = df.index)
#create a table with category-value pairs from all lists, missing values are set to NaN
df = df.pivot(index = "day/time", columns = "category", values = "val")
#plot a stacked bar chart 
df.plot(kind = "bar", stacked = True)
fig=df.iplot(kin='bar',barmode='stack',asFigure=True)

plotly.offline.plt(fig,filename="stack1.html)
However I faced two errors:

1.When Time intervals are very close,Data overlaps on graph.Is there a way to overcome it.

2.When using large data set,graph us not getting plotted giving the error message :
ValueError: Index contains duplicate entries, cannot reshape.

To overcome the error 2,i tried some random integer adding to A column(date value but same error).All the time entries are unique in my data set but still giving the error.Any suggestions please.