Ric*_*ich 5 python command-line matplotlib python-2.7 theano
我正在研究ML / Theano,最近遇到了这个脚本:https ://gist.github.com/notmatthancock/68d52af2e8cde7fbff1c9225b2790a7f 玩起来很酷。和所有ML研究人员一样,我最近升级到了服务器,虽然功能更强大,但它也给我带来了问题。
该脚本很长,但是以以下代码结尾:
def plot_stuff(inputs, outputs, losses, net_func, n_hidden):
fig,axes = plt.subplots(1,2,figsize=(12,6))
axes[0].plot(np.arange(losses.shape[0])+1, losses)
axes[0].set_xlabel('iteration')
axes[0].set_ylabel('loss')
axes[0].set_xscale('log')
axes[0].set_yscale('log')
x,y = np.mgrid[inputs[:,0].min():inputs[:,0].max():51j, inputs[:,1].min():inputs[:,1].max():51j]
z = net_func( np.c_[x.flatten(), y.flatten()] ).reshape(x.shape)
axes[1].contourf(x,y,z, cmap=plt.cm.RdBu, alpha=0.6)
axes[1].plot(inputs[outputs==0,0], inputs[outputs==0,1], 'or')
axes[1].plot(inputs[outputs==1,0], inputs[outputs==1,1], 'sb')
axes[1].set_title('Percent missclassified: %0.2f%%' % (((net_func(inputs)>0.5) != outputs.astype(np.bool)).mean()*100))
fig.suptitle('Shallow net with %d hidden units'%n_hidden)
plt.show()
if __name__=='__main__':
n_hidden = 40
inputs, outputs = gen_data(n_samples_per_class=100)
losses, net_func = train_neural_network(inputs=inputs, outputs=outputs, n_hidden=n_hidden, n_iters=int(2000), learning_rate=0.1)
plot_stuff(inputs, outputs, losses, net_func, n_hidden)
Run Code Online (Sandbox Code Playgroud)
生成以下图表:
当我尝试在服务器上运行它时,它是一个只有命令行而没有屏幕的服务器,我可以预料地收到此错误:
fedora@ip-173-33-18-911:~/scripting/spiral$ python spiral.py
Iteration 2000 / 2000, Loss: 0.172083
Traceback (most recent call last):
File "spiral.py", line 133, in <module>
plot_stuff(inputs, outputs, losses, net_func, n_hidden)
File "spiral.py", line 110, in plot_stuff
fig,axes = plt.subplots(1,2,figsize=(12,6))
File "/usr/lib/pymodules/python2.7/matplotlib/pyplot.py", line 1046, in subplots
fig = figure(**fig_kw)
File "/usr/lib/pymodules/python2.7/matplotlib/pyplot.py", line 423, in figure
**kwargs)
File "/usr/lib/pymodules/python2.7/matplotlib/backends/backend_tkagg.py", line 79, in new_figure_manager
return new_figure_manager_given_figure(num, figure)
File "/usr/lib/pymodules/python2.7/matplotlib/backends/backend_tkagg.py", line 87, in new_figure_manager_given_figure
window = Tk.Tk()
File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1767, in __init__
self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
_tkinter.TclError: no display name and no $DISPLAY environment variable
Run Code Online (Sandbox Code Playgroud)
有没有一种方法/方法/功能可以在命令行中显示图表和图形?
Nic*_*mer 14
termplotlib (a small project of mine) might come in handy here. Install with
pip3 install termplotlib --user
Run Code Online (Sandbox Code Playgroud)
and produce terminal plots like
pip3 install termplotlib --user
Run Code Online (Sandbox Code Playgroud)
7 +---------------------------------------------------+
| |
6 | ** |
| ** |
| ** |
5 | ** |
| *** |
4 | **** |
| ***** |
3 | ***************** |
| **** |
2 | *** |
| *** |
| *** |
1 | ** |
|** |
0 +---------------------------------------------------+
0 1 2 3 4 5 6 7
Run Code Online (Sandbox Code Playgroud)
Sav*_*omo 14
检查允许使用 python3 在终端上直接绘制数据的包plotext。它非常直观,因为它的使用与matplotlib包非常相似。
这是一个基本示例:
您可以使用以下命令安装它:
sudo -H pip install plotext
Run Code Online (Sandbox Code Playgroud)
至于 matplotlib,主要功能是scatter(对于单点)、plot(对于由线连接的点)和show(在终端上实际打印绘图)。很容易指定绘图尺寸、点和线样式以及显示轴、数字刻度和最终方程的任何内容,用于将绘制的坐标转换为原始实数值。
这是生成上面显示的图的代码:
import plotext.plot as plx
import numpy as np
l=3000
x=np.arange(0, l)
y=np.sin(4*np.pi/l*np.array(x))*np.exp(-0.5*np.pi/l*x)
plx.scatter(x, y, rows = 17, cols = 70)
plx.show(clear = 0)
Run Code Online (Sandbox Code Playgroud)
clear=True
里面的选项show
用于在绘图前清除终端:这很有用,例如,在绘制连续的数据流时。绘制连续数据流的示例如下所示:
该包描述提供了更多的信息,如何自定义曲线。该软件包已在 Ubuntu 16 上进行了测试,可以完美运行。未来可能的发展(根据要求)可能涉及对 python2 和其他图形界面(例如 jupiter)的扩展。如果您在使用时遇到任何问题,请告诉我。谢谢。
我希望这能解决你的问题。
我创建了一个名为的小包termplot
,用于从列表中创建垂直条形图。
pip install termplot
Run Code Online (Sandbox Code Playgroud)
import termplot
termplot.plot([1,2,3,4,-5,5,-4,-1,0,-10,-4,-2,3,5,8,10,12,10,8,7,6,5,4,3,2,1])
Run Code Online (Sandbox Code Playgroud)
在我看来,terminalplot比@William234234建议的包更完整,可能是一个很好的解决方案。
用法示例:
import terminalplot as tp
import numpy as np
from math import sin, pi
x=np.linspace(0,2*pi,100);
y=[sin(m)+m for m in x];
tp.plot(list(x),y)
Run Code Online (Sandbox Code Playgroud)
小智 6
您可以在此处选择两个选项:
导出为图像或PDF。此处提供的信息:http : //matplotlib.org/faq/howto_faq.html此处的关键信息如下:
# do this before importing pylab or pyplot
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot([1,2,3])
fig.savefig('test.png')
Run Code Online (Sandbox Code Playgroud)如果您的服务器支持X11转发(或者您可以启用/安装X11转发),则可以通过设置显示方式SSH进入服务器。在linux上,运行:
DISPLAY=:0.0 ssh -Y <server ip>
Run Code Online (Sandbox Code Playgroud)
这将设置您的机器以将任何显示输出从服务器转发到PC。如果您运行的是Windows,则可以使用MobaXterm简化操作,也可以自己配置X11客户端。如果我没记错的话,Mac同样容易。
如果你想用图表弹出一个外部窗口,运行绘图,然后
>>> matplotlib.pyplot.show(block=True)
这将在单独的窗口中弹出图表。
如果您plot()
在此调用之前多次调用,它将弹出相同数量的带有相应图表的窗口。只有当您关闭所有弹出的图表窗口时,控制才会返回给 Python。
我喜欢将它包装在一个小辅助函数中,如下所示:
def show():
return matplotlib.pyplot.show(block=True)
Run Code Online (Sandbox Code Playgroud)
然后我只要show()
想看任何尚未显示的情节就打电话。
可以在终端和终端模拟器中绘制光栅图像:
import matplotlib
matplotlib.use('module://matplotlib-sixel')
from pylab import *
plt.plot(sin(arange(100) / 10))
show()
Run Code Online (Sandbox Code Playgroud)
此特定示例使用matplotlib-sixel,这是一个使用 Xterm 模拟Sixel兼容终端和 ImageTrick 的库。类似的技术可以在 Linux 终端(通过Framebuffer)或模拟器(kitty或iTerm2)中实现。FOSS 社区在过去几年中提供了很好的解决方案(如libsixel)。
另一种选择是使用X11 转发或使用基于 Sixel 的打印机,如lsix。但是所有这些选项都发生在 Python shell 本身之外。
当然,在服务器中运行Jupyter Notebook可能比在终端中硬塞一个图像更好。这可能不值得。