实时绘制 pandas 数据帧
realtime plotting pandas dataframe
我是 matplotlib
的新手,正在尝试显示我通过函数 read_API 从 api 下载的三个变量的最后一小时数据的实时图().数据位于具有 DateTimeIndex 的 pandas 数据框中。
例如:
In: dframe.head()
Out:
A B C
timestamp
2017-05-11 16:21:55 0.724931 0.361333 0.517720
2017-05-11 16:22:25 0.725386 0.360833 0.518632
2017-05-11 16:22:55 0.725057 0.361333 0.521157
2017-05-11 16:23:25 0.724402 0.362133 0.520002
简化代码为:
import pandas as pd
import matplotlib.pyplot as plt
import datetime as dt
while True:
dframe = read_API()
dframe['timestamp'] = dframe['timestamp'] + pd.DateOffset(hours=timezone)
dframe = dframe.set_index('timestamp')
end = dframe.index.max()
start= end.to_datetime() - dt.timedelta(hours=1)
dframe = dframe.loc[start:end]
plt.ion()
fig, ax = plt.subplots()
plt.pause(0.0001)
ax.plot_date(dframe.index.to_pydatetime(), dframe,marker='', linestyle='solid')
plt.draw()
它每几秒钟就会生成更新的图,但是:
1) 每个图都出现在一个新的 window 中(称为图 1、图 2、图 3.....)。我想要一个 window 情节覆盖前一个
2)每一个plot出现的时候都是空白的。然后另一个空白出现,然后另一个,然后第一个完成,依此类推。实际剧情落后3位数左右.....
我对plots和subplots的区别有点困惑,我想这个问题可能与此有关。
我认为您的代码的问题在于您每次刷新数据时都会调用 fig, ax = plt.subplots()
。这每次都会创建一个新的 Figure
,因此您会看到新的框架弹出。
相反,您想在 while
循环之外创建 Figure
,并且只在加载新的 Axes
后刷新数据。
我已经使用您提供的基本示例创建了一个自更新 Figure
。
import pandas as pd
import matplotlib.pyplot as plt
import datetime as dt
data = [
{'timestamp': '2017-05-11 16:21:55', 'A': 0.724931, 'B': 0.361333, 'C': 0.517720},
{'timestamp': '2017-05-11 16:22:25', 'A': 0.725386, 'B': 0.360833, 'C': 0.518632},
{'timestamp': '2017-05-11 16:22:55', 'A': 0.725057, 'B': 0.361333, 'C': 0.521157},
{'timestamp': '2017-05-11 16:23:25', 'A': 0.724402, 'B': 0.362133, 'C': 0.520002},
]
df = pd.DataFrame(data)
df.set_index("timestamp")
plt.ion()
fig, ax = plt.subplots()
while True:
dframe = df.copy()
dframe['timestamp'] = pd.to_datetime(dframe['timestamp']) + pd.DateOffset(hours=2)
dframe = dframe.set_index('timestamp')
end = dframe.index.max()
start= end.to_datetime() - dt.timedelta(hours=1)
dframe = dframe.loc[start:end]
plt.pause(0.0001)
ax.plot_date(dframe.index.to_pydatetime(), dframe, marker='', linestyle='solid')
编辑 1
我无法重现引发的 Warning
, but my guess would be that it's related to the pause
调用。也许尝试交换以下内容并编辑暂停时间。
ax.plot_date(dframe.index.to_pydatetime(), dframe, marker='', linestyle='solid')
plt.pause(0.01)
编辑 2
固定颜色非常简单。定义您的调色板,然后从中挑选。
colors = ['r', 'g', 'b']
plt.ion()
fig, ax = plt.subplots()
while True:
dframe = df.copy()
# Your data manipulation
# ...
dframe = dframe.loc[start:end]
for i, column in enumerate(dframe.columns):
ax.plot(dframe.index.to_pydatetime(), dframe[column], color=colors[i], marker=None, linestyle='solid')
plt.pause(0.1)
如果您有更多列,请向 colors
数组添加更多颜色。或者,根据 dframe
.
中的列数即时生成它
我是 matplotlib
的新手,正在尝试显示我通过函数 read_API 从 api 下载的三个变量的最后一小时数据的实时图().数据位于具有 DateTimeIndex 的 pandas 数据框中。
例如:
In: dframe.head()
Out:
A B C
timestamp
2017-05-11 16:21:55 0.724931 0.361333 0.517720
2017-05-11 16:22:25 0.725386 0.360833 0.518632
2017-05-11 16:22:55 0.725057 0.361333 0.521157
2017-05-11 16:23:25 0.724402 0.362133 0.520002
简化代码为:
import pandas as pd
import matplotlib.pyplot as plt
import datetime as dt
while True:
dframe = read_API()
dframe['timestamp'] = dframe['timestamp'] + pd.DateOffset(hours=timezone)
dframe = dframe.set_index('timestamp')
end = dframe.index.max()
start= end.to_datetime() - dt.timedelta(hours=1)
dframe = dframe.loc[start:end]
plt.ion()
fig, ax = plt.subplots()
plt.pause(0.0001)
ax.plot_date(dframe.index.to_pydatetime(), dframe,marker='', linestyle='solid')
plt.draw()
它每几秒钟就会生成更新的图,但是: 1) 每个图都出现在一个新的 window 中(称为图 1、图 2、图 3.....)。我想要一个 window 情节覆盖前一个 2)每一个plot出现的时候都是空白的。然后另一个空白出现,然后另一个,然后第一个完成,依此类推。实际剧情落后3位数左右..... 我对plots和subplots的区别有点困惑,我想这个问题可能与此有关。
我认为您的代码的问题在于您每次刷新数据时都会调用 fig, ax = plt.subplots()
。这每次都会创建一个新的 Figure
,因此您会看到新的框架弹出。
相反,您想在 while
循环之外创建 Figure
,并且只在加载新的 Axes
后刷新数据。
我已经使用您提供的基本示例创建了一个自更新 Figure
。
import pandas as pd
import matplotlib.pyplot as plt
import datetime as dt
data = [
{'timestamp': '2017-05-11 16:21:55', 'A': 0.724931, 'B': 0.361333, 'C': 0.517720},
{'timestamp': '2017-05-11 16:22:25', 'A': 0.725386, 'B': 0.360833, 'C': 0.518632},
{'timestamp': '2017-05-11 16:22:55', 'A': 0.725057, 'B': 0.361333, 'C': 0.521157},
{'timestamp': '2017-05-11 16:23:25', 'A': 0.724402, 'B': 0.362133, 'C': 0.520002},
]
df = pd.DataFrame(data)
df.set_index("timestamp")
plt.ion()
fig, ax = plt.subplots()
while True:
dframe = df.copy()
dframe['timestamp'] = pd.to_datetime(dframe['timestamp']) + pd.DateOffset(hours=2)
dframe = dframe.set_index('timestamp')
end = dframe.index.max()
start= end.to_datetime() - dt.timedelta(hours=1)
dframe = dframe.loc[start:end]
plt.pause(0.0001)
ax.plot_date(dframe.index.to_pydatetime(), dframe, marker='', linestyle='solid')
编辑 1
我无法重现引发的 Warning
, but my guess would be that it's related to the pause
调用。也许尝试交换以下内容并编辑暂停时间。
ax.plot_date(dframe.index.to_pydatetime(), dframe, marker='', linestyle='solid')
plt.pause(0.01)
编辑 2
固定颜色非常简单。定义您的调色板,然后从中挑选。
colors = ['r', 'g', 'b']
plt.ion()
fig, ax = plt.subplots()
while True:
dframe = df.copy()
# Your data manipulation
# ...
dframe = dframe.loc[start:end]
for i, column in enumerate(dframe.columns):
ax.plot(dframe.index.to_pydatetime(), dframe[column], color=colors[i], marker=None, linestyle='solid')
plt.pause(0.1)
如果您有更多列,请向 colors
数组添加更多颜色。或者,根据 dframe
.