Plotly:如何在多行上绘制分组结果?

adn*_*nan 1 python pandas d3.js plotly

我正在尝试根据“Plotly”中的类别和日期的 ID 计数创建多个折线图 我的日期包含三列“日期”、“类别”、“ID”

我现在使用此代码绘制了一条线

b=mdata.groupby(['Date']).count()['ID ']
b=b.sort_index(ascending=True)


xScale = b.index
yScale = b.values
trace =go.Scatter(
    x = xScale,
    y = yScale,
    marker=dict(
        color='Red')

)
data2 = [trace]
graphJSON2 = json.dumps(data2, cls=plotly.utils.PlotlyJSONEncoder)
Run Code Online (Sandbox Code Playgroud)

输出图表应该在 X 轴上有日期,在 Y 轴上有 ID 计数和基于类别的多条线

ves*_*and 5

据我所知,您将不得不使用pandas.DataFrame.pivot 之类的方法来获取您在此处寻找的数据结构。这是使用以下示例数据框应该适合您的数据集描述的建议:

数据:

         Date  ID Category
0  2013-01-02   1        A
1  2013-01-02   3        B
2  2013-01-03   1        C
3  2013-01-03   2        B
4  2013-01-03   1        B
5  2013-01-03   3        A
6  2013-01-03   3        A
7  2013-01-03   4        A
8  2013-01-04   4        B
9  2013-01-04   4        C
10 2013-01-05   1        B
11 2013-01-06   2        A
Run Code Online (Sandbox Code Playgroud)

阴谋:

在此处输入图片说明

代码:

import plotly.graph_objs as go
import pandas as pd
import numpy as np

# sample dataframe to match OPs structure
df = pd.DataFrame({'Date' : [pd.Timestamp('20130102'), pd.Timestamp('20130102'), 
                             pd.Timestamp('20130103'), pd.Timestamp('20130103'),
                             pd.Timestamp('20130103'), pd.Timestamp('20130103'),
                             pd.Timestamp('20130103'), pd.Timestamp('20130103'),
                             pd.Timestamp('20130104'), pd.Timestamp('20130104'),
                           pd.Timestamp('20130105'),pd.Timestamp('20130106')],
                    'ID' : [1, 3, 1, 2, 1 , 3,3,4,4,4,1,2],
                    'Category' : pd.Categorical(["A","B","C","B","B","A",
                                                 "A","A","B","C","B","A"  ])})
# data munging to get OPs desired plot
df = pd.pivot_table(df, values='ID', index=['Date'],columns='Category', aggfunc=np.sum)

# ploty
fig = go.Figure()
for col in df.columns:
    fig.add_trace(go.Scatter(x=df.index, y=df[col].values,
                             name = col,
                             mode = 'markers+lines',
                             line=dict(shape='linear'),
                             connectgaps=True
                             )
                 )
fig.show()
Run Code Online (Sandbox Code Playgroud)