根据分类列绘制时间序列数据

问题描述 投票:0回答:2

我正在尝试用 x 轴作为日期,y 轴作为分类变量来绘制我的数据(一个巨大的数据)。 (数据示例如下。) 我尝试如下,但图表不可读。我也想让它互动。

我只想在特定日期显示特定事件(代码)基于不同来源发生,例如创建包含线条、日期和文本的时间线

     ID     DATE        CODE                SOURCE
0   P04  2016-08-08      f                  m1
1   P04  2015-05-08      f                  m1
2   P04  2010-07-20      v                  m3
3   P04  2013-12-06      g                  m4
4   P08  2018-03-01      h                  m4


x2 = df.groupby(['DATE', 'CODE']).size()
x2.plot.bar()


预期输出(创建一个包含行、日期和文本的时间线,这里是代码 ) :

python dataframe matplotlib plot plotly
2个回答
0
投票

Plotly 是交互式图表的良好来源。准确地说出你想要什么有点困难,但这应该会给你一些想法。

import pandas as pd
import plotly.express as px
df = pd.DataFrame({'ID': ['P04', 'P04', 'P04', 'P04', 'P08'],
 'DATE': ['2016-08-08 00:00:00',
  '2015-05-08 00:00:00',
  '2010-07-20 00:00:00',
  '2013-12-06 00:00:00',
  '2018-03-01 00:00:00'],
 'CODE': ['f', 'f', 'v', 'g', 'h'],
 'SOURCE': ['m1', 'm1', 'm3', 'm4', 'm4']})
df['DATE'] = pd.to_datetime(df['DATE'])

fig = px.scatter(df, x='DATE', y='CODE', color='SOURCE')
fig.update_traces(marker={'size': 15})
fig.show()


0
投票

问题中的示例数据不会导致预期的输出。预期的输出似乎是 matplotlib 时间线,所以我会引用该数据并在 plolty 中创建一个图表。您将使用的图形对象是一个图形对象。首先,绘制 Level 数据的条形图。其次,在 y 轴的位置 0 处绘制一条水平线。第三,在散点图标记模式下添加标记。第四,您以散点图文本模式注释版本号。第五,在散点图文本模式下添加版本号。第五,在散点图文本模式下添加版本号。这么多循环处理的原因是根据值将注释位置设置为向上或向下。

import numpy as np
import pandas as pd
from datetime import datetime
import plotly.graph_objects as go

names = ['v2.2.4', 'v3.0.3', 'v3.0.2', 'v3.0.1', 'v3.0.0', 'v2.2.3',
         'v2.2.2', 'v2.2.1', 'v2.2.0', 'v2.1.2', 'v2.1.1', 'v2.1.0',
         'v2.0.2', 'v2.0.1', 'v2.0.0', 'v1.5.3', 'v1.5.2', 'v1.5.1',
         'v1.5.0', 'v1.4.3', 'v1.4.2', 'v1.4.1', 'v1.4.0']

dates = ['2019-02-26', '2019-02-26', '2018-11-10', '2018-11-10',
         '2018-09-18', '2018-08-10', '2018-03-17', '2018-03-16',
         '2018-03-06', '2018-01-18', '2017-12-10', '2017-10-07',
         '2017-05-10', '2017-05-02', '2017-01-17', '2016-09-09',
         '2016-07-03', '2016-01-10', '2015-10-29', '2015-02-16',
         '2014-10-26', '2014-10-18', '2014-08-26']

# Choose some nice levels
levels = np.tile([-5, 5, -3, 3, -1, 1],int(np.ceil(len(dates)/6)))[:len(dates)]

df = pd.DataFrame({'Name': names,'Date': dates, 'Level': levels})
df['Date'] = pd.to_datetime(df['Date'])

fig = go.Figure()

fig.add_trace(go.Bar(
    x=df['Date'],
    y=df['Level'],
    showlegend=False,
    width=0.05,
    marker=dict(
        color="red"
    )))

fig.add_trace(go.Scatter(
    x=df['Date'],
    y=[0]*len(df),
    showlegend=False,
    line_width=2,
    line_color='black'
    ))

fig.add_trace(go.Scatter(
    x=df['Date'],
    y=[0]*len(df),
    mode='markers',
    line_color='black',
    showlegend=False,
    marker=dict(
        color="white",
        size=8,
        line=dict(
            color='black',
            width=2)
    )))

for row in df.itertuples():
    fig.add_trace(go.Scatter(
        x=[row.Date],
        y=[row.Level],
        mode="markers+text",
        marker=dict(color='red'),
        showlegend=False,
        text=[row.Name],
        textposition='bottom center' if row.Level <=0 else 'top center',
            ))

fig.update_xaxes(type='category', tickvals=df.index, ticktext=[x.strftime('%Y-%m') for x in df['Date'].dt.date],tickangle=-45)
fig.update_yaxes(range=[df['Level'].min()-2, df['Level'].max()+2,], visible=False, showgrid=False, showticklabels=False)
fig.update_layout(height=400, title="Version history", template=None)

fig.show()

© www.soinside.com 2019 - 2024. All rights reserved.