import matplotlib
import matplotlib.pyplot as plt
matplotlib是很高效的可视化工具包,pycharm的SciView模式可以缓存上一次plot的图像,因此能够同时显示多张图像,如下图1所示,相较于跳出独立窗口的显示方式,
图1
SciView更灵活。SciView的配置方式为图2所示:
图2
==============================================================================================================================
Pycharm运行本地解释器,检查matplotlib.get_backend(),
>>matplotlib.get_backend()
'module://backend_interagg'
backend_interagg就能很好地兼容pycharm的SciView,
plt.show() 后可以SciView可以正常显示图像,如图1,然而运行远程解释器(Remote Server Debug)时,会遇到问题。例如
----------------------------------------------------------------------------------------------------------------------------------------------
问题1:
>>plt.show()
Error: failed to send plot to http://127.0.0.1:63342
Traceback (most recent call last):
File "/lustre/home/dlyu/.app/Python-3.6.4rc1/lib/python3.6/urllib/request.py", line 1318, in do_open
........
ConnectionRefusedError: [Errno 111] Connection refused
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/lustre/home/dlyu/.pycharm_helpers/pycharm_display/datalore/display/display_.py", line 60, in _send_display_message
urlopen(url, buffer)
urllib.error.URLError: <urlopen error [Errno 111] Connection refused>
.....
----------------------------------------------------------------------------------------------------------------------------------------------
问题2:或者压根不报错,就是不显示图像。我把Pycharm重装最新版本后,不出现问题2,而是变为问题1了。
----------------------------------------------------------------------------------------------------------------------------------------------
在“http://127.0.0.1:63342”中的63342是环境变量os.environ['PYCHARM_DISPLAY_PORT']或者os.getenv("PYCHARM_MATPLOTLIB_PORT")。 远程解释器尝试将图像数据发送到 远程服务器的127.0.0.1 : 63342 ,然而Connection refused。SciView的运行机制是:本地笔记本的Pycharm会侦听127.0.0.1:63342 ,远程解释器会将图像数据发送到127.0.0.1 : 63342,因此在Pycharm收到图像数据后,会在SciView中显示。
为了解决以上Connection refused问题,ssh远程端口转发可以建立起远程server127.0.0.1 : 63342 和 本机笔记本127.0.0.1:63342 之间的channel。
在本地笔记本上运行 ssh -R 63342:127.0.0.1:63342 user@serverIP , 在运行plt.plot() 以及 plt.show() ,SciView能够显示图像。
解决方法参考https://youtrack.jetbrains.com/issue/PY-27489