这篇文章上次修改于 612 天前,可能其部分内容已经发生变化,如有疑问可询问作者。
我总算被 matplotlib 的交互模式逼疯了。
不得不说matplotlib.pyplot.pause
的设计着实反人类,这个函数每次调用都要夺走焦点,就算显示的窗口已经被最小化也不例外!能想象你在后台跑着一个程序,然后在另一个窗口里写文章,写着写着突然焦点消失,输入法里的字全都不见,而且这个时候继续打字,说不定会触发 matplotlib 窗口里的什么奇怪的快捷键……
所以我决定彻底放弃 matplotlib 的实时绘图功能。
Plotly 是一个基于网页实现的绘图库,拥有包括 Python 在内的多种语言支持。关于 Plotly 的使用可以参考官方文档或者其他相关文章。
本文只介绍一下使用 Plotly 实现实时绘图的一种思路。
注意,本文默认是不使用 Jupyter Notebook 的。
想到这一思路,是基于以下几个事实:
- Plotly 的 offline 模式可以将图表输出为本地网页,而且不会阻塞。
- 基于 selenium 和 chromedriver 的爬虫可以在后台运行,不会抢占焦点。
- 所以为什么不用 selenium 来显示 plotly 输出的网页呢?
来看看代码实现:
首先,导入所需要的库。
import plotly
import plotly.graph_objects as go
from selenium.webdriver import Chrome
from pathlib import Path
pathlib 是为了方便将 plotly 输出的路径转化为链接,也可以用其他方式替代。
然后打开一个 Chrome 窗口。
driver = Chrome()
接下来画图。
trace = go.Scatter(x=x_list, y=y_list, mode='lines')
plot = plotly.offline.plot([trace], auto_open=False, filename='graph.html')
这里绘制的是折线图,其中x_list
和y_list
是各数据点的坐标。输出为graph.html
,这个文件名也会被赋值到plot
变量中。
最后用 Chrome 显示出来。
driver.get((Path.cwd() / plot).as_uri())
完整代码:
import plotly
import plotly.graph_objects as go
from selenium.webdriver import Chrome
from pathlib import Path
driver = Chrome()
x_list = []
y_list = []
import time
try:
for i in range(1000):
x_list.append(i)
y_list.append(i ** 2)
trace = go.Scatter(x=x_list, y=y_list, mode='lines')
plot = plotly.offline.plot([trace], auto_open=False, filename='graph.html')
driver.get((Path.cwd() / plot).as_uri())
time.sleep(1) # 用一个 sleep 来代替实际应用场景中的其他操作
finally:
driver.close()
放一张效果图:
但是不得不说,这种方法确实挺奇怪的……
没有评论