如何为 Python 中从 t=0 开始的每个 ID 绘制多线图
How to plot multiline for each ID starting at t=0 in Python
所以,我有一个面板时间序列数据集,但由于每个 ID 的开始日期不同,我创建了一个附加变量 t,它是一个计数变量,t=0, 1, 2, 3, 。 ...而且结束日期完全不同。使用数据,我想绘制:
- 一个多线图,其中 x 轴是“t”=0,1,2,3...,y 轴是所有 ID 的“增长”
- 此外,如果我想让 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()
示例输出:
免责声明:示例数据导入无耻地复制自。
所以,我有一个面板时间序列数据集,但由于每个 ID 的开始日期不同,我创建了一个附加变量 t,它是一个计数变量,t=0, 1, 2, 3, 。 ...而且结束日期完全不同。使用数据,我想绘制:
- 一个多线图,其中 x 轴是“t”=0,1,2,3...,y 轴是所有 ID 的“增长”
- 此外,如果我想让 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()
示例输出:
免责声明:示例数据导入无耻地复制自