如何为 Python 中从 t=0 开始的每个 ID 绘制多线图

How to plot multiline for each ID starting at t=0 in Python

所以,我有一个面板时间序列数据集,但由于每个 ID 的开始日期不同,我创建了一个附加变量 t,它是一个计数变量,t=0, 1, 2, 3, 。 ...而且结束日期完全不同。使用数据,我想绘制:

  1. 一个多线图,其中 x 轴是“t”=0,1,2,3...,y 轴是所有 ID 的“增长”
  2. 此外,如果我想让 x 轴从 t=1 开始并省略 t=0?

谢谢!

当前 table:

ID  date     growth  t
x1a 1/1/2018    1.2  0
x1a 2/1/2018    1    1
x1a 3/1/2018    3    2
x1a 4/1/2018    2    3
x1a 5/1/2018    0.9  4
z8d 3/1/2018    0.7  0
z8d 3/2/2018    1    1
z8d 3/3/2018    0.8  2
z8d 3/4/2018    0.6  3
z8d 3/5/2018    2.3  4
z8d 3/6/2018    1.7  5
z8d 3/7/2018    1    6
z8d 3/8/2018    2.1  7
j2u 1/1/2020    0.9  0
j2u 1/2/2020    0.8  1
j2u 1/3/2020    1.3  2
j2u 1/4/2020    1.4  3
j2u 1/5/2020    2    4
j2u 1/6/2020    1.4  5
..    ..         ..  ..

您不需要“t”列,您可以为此使用索引。要为每个 id 绘制一条线,您可以按 id 分组,然后遍历组并绘制。这是一个如何做到这一点的例子:

from io import StringIO

import matplotlib.pyplot as plt
import pandas as pd

data = """ID  date     growth  t
x1a 1/1/2018    1.2  0
x1a 2/1/2018    1    1
x1a 3/1/2018    3    2
x1a 4/1/2018    2    3
x1a 5/1/2018    0.9  4
z8d 3/1/2018    0.7  0
z8d 3/2/2018    1    1
z8d 3/3/2018    0.8  2
z8d 3/4/2018    0.6  3
z8d 3/5/2018    2.3  4
z8d 3/6/2018    1.7  5
z8d 3/7/2018    1    6
z8d 3/8/2018    2.1  7
j2u 1/1/2020    0.9  0
j2u 1/2/2020    0.8  1
j2u 1/3/2020    1.3  2
j2u 1/4/2020    1.4  3
j2u 1/5/2020    2    4
j2u 1/6/2020    1.4  5"""

df = pd.read_csv(StringIO(data), sep='\s+')
df['date'] = pd.to_datetime(df['date'])

for id_, df in df.groupby(by='ID'):
    df.sort_values(by='date', inplace=True)
    df.reset_index(drop=True, inplace=True)
    plt.plot(df.index + 1, df['growth'], label=id_)


plt.legend()
plt.xlabel('Index')
plt.ylabel('Growth')
plt.show()

您可以将数据重塑为便于 pandas 绘制它们的形式:

from io import StringIO

import matplotlib.pyplot as plt
import pandas as pd

data = """ID  date     growth  t
x1a 1/1/2018    1.2  0
x1a 2/1/2018    1    1
x1a 3/1/2018    3    2
x1a 4/1/2018    2    3
x1a 5/1/2018    0.9  4
z8d 3/1/2018    0.7  0
z8d 3/2/2018    1    1
z8d 3/3/2018    0.8  2
z8d 3/4/2018    0.6  3
z8d 3/5/2018    2.3  4
z8d 3/6/2018    1.7  5
z8d 3/7/2018    1    6
z8d 3/8/2018    2.1  7
j2u 1/1/2020    0.9  0
j2u 1/2/2020    0.8  1
j2u 1/3/2020    1.3  2
j2u 1/4/2020    1.4  3
j2u 1/5/2020    2    4
j2u 1/6/2020    1.4  5"""

df = pd.read_csv(StringIO(data), sep='\s+')
df['date'] = pd.to_datetime(df['date'])


#the actual plotting starts here
#reshape your data for the plot from long to wide format
df_plot = pd.pivot(df, index="t", columns="ID", values="growth")
#renumber the index
df_plot.index += 1
#let pandas matplotlib wrapper do the plotting
df_plot.plot.line()

plt.show()

示例输出:

免责声明:示例数据导入无耻地复制自