如何在一个图中绘制堆叠数据框列中的多行? [python]
How to plot many lines from stacked dataframe column in one plot? [python]
我有一个如下所示的数据框:
timestamp Value Color
--------------------------------------------------
0 2018-03-04 07:11:08 34 Red
1 2018-03-04 07:11:09 34 Red
2 2018-03-04 07:11:10 35 Red
3 2018-03-04 07:11:12 36 Red
4 2018-03-04 07:11:14 24 Red
5 2018-03-04 07:11:15 34 Red
...
55 2018-03-04 07:12:17 34 Blue
56 2018-03-04 07:12:18 35 Blue
57 2018-03-04 07:12:19 36 Blue
58 2018-03-04 07:12:20 37 Blue
59 2018-03-04 07:12:21 35 Blue
60 2018-03-04 07:12:22 32 Blue
所以在 60 秒的过程中,对于每个时间戳,都会记录一个值,但这些值分为两种颜色,红色和蓝色。因此,在这个数据框中,我们看到两条不同曲线的时间序列曲线发生在不同的时间,一条接一条,不重叠。我想做的是绘制它们。但是,我想忽略时间戳,以便假设它们同时开始,因此只需将每种颜色视为一个有序值数组,忽略时间跳跃并假设时间间隔相等。我只想在同一张图表上绘制红色曲线和蓝色曲线。如何在 python 中完成此操作?
我只是在尝试
plt.plot(Blue, Red)
虽然我不确定如何计算 x 轴,但我只想将其设为秒数。
df = pandas.DataFrame({
'times':list(pandas.date_range('2020-01-01',periods=10,freq='15T')) +
list(pandas.date_range('2020-01-01',periods=10,freq='15T')),
'colors':['red']*10 + ['blue'] * 10,
'value': numpy.random.randint(0,255,20)
})
给我们类似你的数据框的东西
times colors value
0 2020-01-01 00:00:00 red 224
1 2020-01-01 00:15:00 red 47
2 2020-01-01 00:30:00 red 25
3 2020-01-01 00:45:00 red 211
4 2020-01-01 01:00:00 red 18
5 2020-01-01 01:15:00 red 119
6 2020-01-01 01:30:00 red 52
7 2020-01-01 01:45:00 red 246
8 2020-01-01 02:00:00 red 54
9 2020-01-01 02:15:00 red 156
10 2020-01-01 00:00:00 blue 42
11 2020-01-01 00:15:00 blue 55
12 2020-01-01 00:30:00 blue 151
13 2020-01-01 00:45:00 blue 236
14 2020-01-01 01:00:00 blue 207
15 2020-01-01 01:15:00 blue 165
16 2020-01-01 01:30:00 blue 131
17 2020-01-01 01:45:00 blue 199
18 2020-01-01 02:00:00 blue 247
19 2020-01-01 02:15:00 blue 61
我们可以使用
df2 = df.pivot(index='times',columns=['colors'],values=['value'])
这给了我们
value
colors blue red
times
2020-01-01 00:00:00 70 225
2020-01-01 00:15:00 162 78
2020-01-01 00:30:00 188 37
2020-01-01 00:45:00 134 234
2020-01-01 01:00:00 46 73
2020-01-01 01:15:00 76 60
2020-01-01 01:30:00 143 61
2020-01-01 01:45:00 150 198
2020-01-01 02:00:00 82 159
2020-01-01 02:15:00 127 94
现在我们可以轻松地绘制它...
df2.plot()
pyplot.show()
您可以使用
删除列名称的值部分
df2 = df2.droplevel(0,axis=1)
df2.plot()
pyplot.show()
另一种选择是单独调用它
BLUE = df[df['colors'] == 'blue']
RED = df[df['colors'] == 'red']
pyplot.plot(BLUE['times'],BLUE['value'])
pyplot.plot(RED['times'],RED['value'])
pyplot.show()
你也可以使用 pandas groupby(可能不要这样做 :P )
def plot_it(group,values):
pyplot.plot(values['times'],values['value'])
df.groupby(['colors']).apply(plot_it)
pyplot.show()
但真正“正确”的处理方式可能是第一个选项
(将其旋转到您想要的形状)
---- 编辑(根据评论)----
如果您不想要月份并将其视为 y 值列表,只需使用范围作为 x
BLUE = df[df['colors'] == 'blue']
RED = df[df['colors'] == 'red']
pyplot.plot(range(len(BLUE)),BLUE['value'])
pyplot.plot(range(len(RED)),RED['value'])
pyplot.show()
我有一个如下所示的数据框:
timestamp Value Color
--------------------------------------------------
0 2018-03-04 07:11:08 34 Red
1 2018-03-04 07:11:09 34 Red
2 2018-03-04 07:11:10 35 Red
3 2018-03-04 07:11:12 36 Red
4 2018-03-04 07:11:14 24 Red
5 2018-03-04 07:11:15 34 Red
...
55 2018-03-04 07:12:17 34 Blue
56 2018-03-04 07:12:18 35 Blue
57 2018-03-04 07:12:19 36 Blue
58 2018-03-04 07:12:20 37 Blue
59 2018-03-04 07:12:21 35 Blue
60 2018-03-04 07:12:22 32 Blue
所以在 60 秒的过程中,对于每个时间戳,都会记录一个值,但这些值分为两种颜色,红色和蓝色。因此,在这个数据框中,我们看到两条不同曲线的时间序列曲线发生在不同的时间,一条接一条,不重叠。我想做的是绘制它们。但是,我想忽略时间戳,以便假设它们同时开始,因此只需将每种颜色视为一个有序值数组,忽略时间跳跃并假设时间间隔相等。我只想在同一张图表上绘制红色曲线和蓝色曲线。如何在 python 中完成此操作? 我只是在尝试
plt.plot(Blue, Red)
虽然我不确定如何计算 x 轴,但我只想将其设为秒数。
df = pandas.DataFrame({
'times':list(pandas.date_range('2020-01-01',periods=10,freq='15T')) +
list(pandas.date_range('2020-01-01',periods=10,freq='15T')),
'colors':['red']*10 + ['blue'] * 10,
'value': numpy.random.randint(0,255,20)
})
给我们类似你的数据框的东西
times colors value
0 2020-01-01 00:00:00 red 224
1 2020-01-01 00:15:00 red 47
2 2020-01-01 00:30:00 red 25
3 2020-01-01 00:45:00 red 211
4 2020-01-01 01:00:00 red 18
5 2020-01-01 01:15:00 red 119
6 2020-01-01 01:30:00 red 52
7 2020-01-01 01:45:00 red 246
8 2020-01-01 02:00:00 red 54
9 2020-01-01 02:15:00 red 156
10 2020-01-01 00:00:00 blue 42
11 2020-01-01 00:15:00 blue 55
12 2020-01-01 00:30:00 blue 151
13 2020-01-01 00:45:00 blue 236
14 2020-01-01 01:00:00 blue 207
15 2020-01-01 01:15:00 blue 165
16 2020-01-01 01:30:00 blue 131
17 2020-01-01 01:45:00 blue 199
18 2020-01-01 02:00:00 blue 247
19 2020-01-01 02:15:00 blue 61
我们可以使用
df2 = df.pivot(index='times',columns=['colors'],values=['value'])
这给了我们
value
colors blue red
times
2020-01-01 00:00:00 70 225
2020-01-01 00:15:00 162 78
2020-01-01 00:30:00 188 37
2020-01-01 00:45:00 134 234
2020-01-01 01:00:00 46 73
2020-01-01 01:15:00 76 60
2020-01-01 01:30:00 143 61
2020-01-01 01:45:00 150 198
2020-01-01 02:00:00 82 159
2020-01-01 02:15:00 127 94
现在我们可以轻松地绘制它...
df2.plot()
pyplot.show()
您可以使用
删除列名称的值部分df2 = df2.droplevel(0,axis=1)
df2.plot()
pyplot.show()
另一种选择是单独调用它
BLUE = df[df['colors'] == 'blue']
RED = df[df['colors'] == 'red']
pyplot.plot(BLUE['times'],BLUE['value'])
pyplot.plot(RED['times'],RED['value'])
pyplot.show()
你也可以使用 pandas groupby(可能不要这样做 :P )
def plot_it(group,values):
pyplot.plot(values['times'],values['value'])
df.groupby(['colors']).apply(plot_it)
pyplot.show()
但真正“正确”的处理方式可能是第一个选项 (将其旋转到您想要的形状)
---- 编辑(根据评论)----
如果您不想要月份并将其视为 y 值列表,只需使用范围作为 x
BLUE = df[df['colors'] == 'blue']
RED = df[df['colors'] == 'red']
pyplot.plot(range(len(BLUE)),BLUE['value'])
pyplot.plot(range(len(RED)),RED['value'])
pyplot.show()