Search code examples
pythonpandasplotly

Plot multiple lines into the same chart over time from pandas group by result using plotly


I want to plot multiple lines in the same chart over time from a pandas groubby result. My data looks the following

import pandas as pd

df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/finance-charts-apple.csv')
df['Date']=pd.to_datetime(df['Date'])

Now I am grouping my data by month and direction

df.groupby([pd.Grouper(key='Date', freq='M'), 'direction'])

Which gives me

Date        direction
2015-02-28  Decreasing     4
            Increasing     5
2015-03-31  Decreasing    14
            Increasing     8
2015-04-30  Decreasing    12
            Increasing     9
2015-05-31  Decreasing    10
....

How would I plot this in a line chart? On the x-Axis I want the time, on the y-Axis the count and for each group within direction I want a line. Preferably using Plotly.


Solution

  • I don't have the expected graph, so I understood from the comments that the graph was to be a line chart of a time series with two different line types. I used a graph object and a loop process to graph the line mode of the scatter plot in the directional units.

    dfg = df.groupby([pd.Grouper(key='Date', freq='M'), 'direction']).size().to_frame('counts')
    dfg.reset_index(inplace=True)
    dfg.head()
    Date    direction   counts
    0   2015-02-28  Decreasing  4
    1   2015-02-28  Increasing  5
    2   2015-03-31  Decreasing  14
    3   2015-03-31  Increasing  8
    4   2015-04-30  Decreasing  12
    
    import plotly.graph_objects as go
    
    fig = go.Figure()
    
    for d,c in zip(dfg['direction'].unique(), ['red','green']):
        dfs = dfg.query('direction == @d')
        fig.add_trace(
            go.Scatter(
                x=dfs['Date'],
                y=dfs['counts'],
                mode='lines',
                line=dict(
                    color=c,
                    width=3
                ),
                name=d
            )
        )
    
    fig.show()
    

    enter image description here