Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cannot run matplotlib with Apache Zeppelin

I am using Zeppelin and matplotlib to visualize some data. I try them but fail with the error below. Could you give me some guidance how to fix it?

%pyspark
import matplotlib.pyplot as plt
plt.plot([1,2,3,4])
plt.ylabel('some numbers')
plt.show()

And here is the error I've got

Traceback (most recent call last):
  File "/tmp/zeppelin_pyspark-3580576524078731606.py", line 235, in <module>
    eval(compiledCode)
  File "<string>", line 1, in <module>
  File "/usr/lib64/python2.6/site-packages/matplotlib/pyplot.py", line 78, in <module>
    new_figure_manager, draw_if_interactive, show = pylab_setup()
  File "/usr/lib64/python2.6/site-packages/matplotlib/backends/__init__.py", line 25, in pylab_setup
    globals(),locals(),[backend_name])
  File "/usr/lib64/python2.6/site-packages/matplotlib/backends/backend_gtkagg.py", line 10, in <module>
    from matplotlib.backends.backend_gtk import gtk, FigureManagerGTK, FigureCanvasGTK,\
  File "/usr/lib64/python2.6/site-packages/matplotlib/backends/backend_gtk.py", line 8, in <module>
    import gtk; gdk = gtk.gdk
  File "/usr/lib64/python2.6/site-packages/gtk-2.0/gtk/__init__.py", line 64, in <module>
    _init()
  File "/usr/lib64/python2.6/site-packages/gtk-2.0/gtk/__init__.py", line 52, in _init
    _gtk.init_check()
RuntimeError: could not open display

I also try to add these lines, but still cannot work

import matplotlib
matplotlib.use('Agg')
like image 819
hminle Avatar asked Aug 27 '26 11:08

hminle


2 Answers

The following works for me with Spark & Python 3:

%pyspark

import matplotlib
import io

# If you use the use() function, this must be done before importing matplotlib.pyplot. Calling use() after pyplot has been imported will have no effect.
# see: http://matplotlib.org/faq/usage_faq.html#what-is-a-backend
matplotlib.use('Agg')
import matplotlib.pyplot as plt

def show(p):
    img = io.StringIO()
    p.savefig(img, format='svg')
    img.seek(0)
    print("%html <div style='width:600px'>" + img.getvalue() + "</div>")

plt.plot([1,2,3,4])
plt.ylabel('some numbers')
show(plt)

The Zeppelin documentation suggests that the following should work:

%python
import matplotlib.pyplot as plt
plt.figure()
(.. ..)
z.show(plt)
plt.close()

This doesn't work for me with Python 3, but looks to be addressed with the soon-to-be-merged PR #1213.

like image 187
eddies Avatar answered Aug 29 '26 02:08

eddies


Note that as of Zeppelin 0.7.3, matplotlib integration is much more seamless, so the methods described here are no longer necessary. https://zeppelin.apache.org/docs/latest/interpreter/python.html#matplotlib-integration

like image 23
PriceHardman Avatar answered Aug 29 '26 01:08

PriceHardman