Generating a PNG with matplotlib when DISPLAY is undefined

前端 未结 12 1258
感动是毒
感动是毒 2020-11-22 02:51

I am trying to use networkx with Python. When I run this program it get this error. Is there anything missing?

#!/usr/bin/env python

import networkx as nx
i         


        
相关标签:
12条回答
  • 2020-11-22 03:02

    One other thing to check is whether your current user is authorised to connect to the X display. In my case, root was not allowed to do that and matplotlib was complaining with the same error.

    user@debian:~$ xauth list         
    debian/unix:10  MIT-MAGIC-COOKIE-1  ae921efd0026c6fc9d62a8963acdcca0
    root@debian:~# xauth add debian/unix:10  MIT-MAGIC-COOKIE-1 ae921efd0026c6fc9d62a8963acdcca0
    root@debian:~# xterm
    

    source: http://www.debian-administration.org/articles/494 https://debian-administration.org/article/494/Getting_X11_forwarding_through_ssh_working_after_running_su

    0 讨论(0)
  • 2020-11-22 03:07

    I got the error while using matplotlib through Spark. matplotlib.use('Agg') doesn't work for me. In the end, the following code works for me. More here

    import matplotlib.pyplot as plt.
    plt.switch_backend('agg')
    
    0 讨论(0)
  • 2020-11-22 03:12

    What system are you on? It looks like you have a system with X11, but the DISPLAY environment variable was not properly set. Try executing the following command and then rerunning your program:

    export DISPLAY=localhost:0
    
    0 讨论(0)
  • 2020-11-22 03:12

    To make sure your code is portable across Windows, Linux and OSX and for systems with and without displays, I would suggest following snippet:

    import matplotlib
    import os
    # must be before importing matplotlib.pyplot or pylab!
    if os.name == 'posix' and "DISPLAY" not in os.environ:
        matplotlib.use('Agg')
    
    # now import other things from matplotlib
    import matplotlib.pyplot as plt
    

    Credit: https://stackoverflow.com/a/45756291/207661

    0 讨论(0)
  • 2020-11-22 03:21

    For Google Cloud Machine Learning Engine:

    import matplotlib as mpl
    mpl.use('Agg')
    from matplotlib.backends.backend_pdf import PdfPages
    

    And then to print to file:

    #PDF build and save
        def multi_page(filename, figs=None, dpi=200):
            pp = PdfPages(filename)
            if figs is None:
                figs = [mpl.pyplot.figure(n) for n in mpl.pyplot.get_fignums()]
            for fig in figs:
                fig.savefig(pp, format='pdf', bbox_inches='tight', fig_size=(10, 8))
            pp.close()
    

    and to create the PDF:

    multi_page(report_name)
    
    0 讨论(0)
  • 2020-11-22 03:24

    The main problem is that (on your system) matplotlib chooses an x-using backend by default. I just had the same problem on one of my servers. The solution for me was to add the following code in a place that gets read before any other pylab/matplotlib/pyplot import:

    import matplotlib
    # Force matplotlib to not use any Xwindows backend.
    matplotlib.use('Agg')
    

    The alternative is to set it in your .matplotlibrc

    0 讨论(0)
提交回复
热议问题