解决Ubuntu下Pyspark中调用hist函数出现”No display name and no $DISPLAY environment variable”错误

这两天开始接触深度学习领域,在网上找了《Spark机器学习》电子书进行学习,在绘制直方图执行

hist(ages,bins=20,color='lightblue',normed=True)语句时候,出现如下错误:

Traceback(most recent call last):

  File"simple_code.py", line 33, in <module>

    plt.scatter(x, y, s=20)

  File"/usr/lib/python2.7/matplotlib/pyplot.py", line 3078, in scatter

    ax = gca()

  File"/usr/lib/python2.7/matplotlib/pyplot.py", line 803, in gca

    ax =  gcf().gca(**kwargs)

  File"/usr/lib/python2.7/matplotlib/pyplot.py", line 450, in gcf

    return figure()

  File"/usr/lib/python2.7/matplotlib/pyplot.py", line 423, in figure

    **kwargs)

  File"/usr/lib/python2.7/matplotlib/backends/backend_tkagg.py", line 79,in new_figure_manager

    return new_figure_manager_given_figure(num,figure)

  File"/usr/lib/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 1712, in __init__

    self.tk = _tkinter.create(screenName,baseName, className, interactive, wantobjects, useTk, sync, use)

_tkinter.TclError: no display name and no $DISPLAYenvironment variable

经过网上的不断搜索解决方法并不断尝试(好多都是英文),成功绘制了直方图

1.重新启动终端,这一步很多教程都没有提,也是我按照许多教程操作没有成功的原因。如果你也遇到了类似的问题,不妨先试试重启一个终端

2.使用ssh -X登录,由于我是只有单机配置,所以这里输入的是ssh -X localhost,输入用户密码即可成功登录ssh,当然也可以配置免密码登录,可参考我的上一篇文章

3.进入spark目录执行pyspark

cd $SPARK_HOME/bin

sudo ./pyspark

4.pyspark成功启动后,先导入必要的包(书里不提这个事情,所以按照书里步骤,直接提示hist not defined,真是坑害初学者)

matplotlib包需要自己提前安装,最简单的办法便是执行sudo apt-get install python-matplotlib

>>> from matplotlib.pyplot import *

5.再次执行hist语句,没有报错,但也没有显示预期的直方图

>>>hist(ages,bins=20,color='lightblue',normed=True)

(array([ 0.00064269, 0.00192808,  0.00449886,  0.0279572 , 0.02956393,

        0.03374144, 0.04563129,  0.02538642,  0.02088756, 0.01863813,

        0.02088756, 0.01606735,  0.0170314 ,  0.01863813, 0.00674829,

        0.00482021, 0.0054629 ,  0.00192808,  0.00128539, 0.00128539]), array([  7. ,  10.3, 13.6,  16.9,  20.2, 23.5,  26.8,  30.1, 33.4,

        36.7, 40. ,  43.3,  46.6, 49.9,  53.2,  56.5, 59.8,  63.1,

        66.4, 69.7,  73. ]), <a list of 20Patch objects>)

>>> fig=matplotlib.pyplot.gcf()

>>> fig.set_size_inches(16,10)

6.执行fig.show()语句,或执行fig.savefig语句,将生成的直方图保存到本地

>>> fig.show()

>>> fig.savefig("/home/3.png")

7.预期的直方图成功出现

解决Ubuntu下Pyspark中调用hist函数出现”No display name and no $DISPLAY environment variable”错误

注:如果执行了多个hist语句,可能造成多个图最后堆叠到一个图片中,这时可以执行clf()函数来清除所有图片,重新绘制

>>>clf() #清图

>>>cla() #清坐标轴

>>>close() #关窗口

 

PS:论画图,还是Windows下的Python要更省心……