Issue 1:
Bug report

Bug summary

matplotlib.pyplot isn't friendly to remotely run commands with no X server:

In [1]: import matplotlib.pyplot

In [2]: QXcbConnection: Could not connect to display
Aborted

However, selecting the backend before hand fixes the problem:

In [1]: import matplotlib

In [2]: matplotlib.use("Agg")

In [3]: import matplotlib.pyplot

I am not very familiar, but could there be some check of the display module before importing? My problem is I obtain this error when running on a remote server with no X11 forwarding and importing a library that by default imports maplotlib.pyplot. (The library is pims )

Matplotlib version

Operating System: Linux (Debian)

Matplotlib Version: 1.5.3

Python Version: 3.5.3

IPython Version : 5.1.0

I installed matplotlib via pip.

Issue 2:
This is reproducible on any headless environment using matplotlib 1.5.1. On my system, the following script:

from matplotlib import pyplot as plt
plt.plot([1, 2], [1, 2])

Will produce the following traceback:

---------------------------------------------------------------------------
TclError Traceback (most recent call last)
<ipython-input-2-8dd816f9ddc7> in <module>()
----> 1 plt.plot([1, 2], [1, 2])

/home/goldbaum/.virtualenvs/yt-dev/local/lib/python2.7/site-packages/matplotlib/pyplot.pyc in plot(*args, **kwargs)
3145 @_autogen_docstring(Axes.plot)
3146 def plot(*args, **kwargs):
-> 3147 ax = gca()
3148 # allow callers to override the hold state by passing hold=True|False
3149 washold = ax.ishold()

/home/goldbaum/.virtualenvs/yt-dev/local/lib/python2.7/site-packages/matplotlib/pyplot.pyc in gca(**kwargs)
926 matplotlib.figure.Figure.gca : The figure's gca method.
927 """
--> 928 return gcf().gca(**kwargs)
929
930 # More ways of creating axes:

/home/goldbaum/.virtualenvs/yt-dev/local/lib/python2.7/site-packages/matplotlib/pyplot.pyc in gcf()
576 return figManager.canvas.figure
577 else:
--> 578 return figure()
579
580

/home/goldbaum/.virtualenvs/yt-dev/local/lib/python2.7/site-packages/matplotlib/pyplot.pyc in figure(num, figsize, dpi, facecolor, edgecolor, frameon, FigureClass, **kwargs)
525 frameon=frameon,
526 FigureClass=FigureClass,
--> 527 **kwargs)
528
529 if figLabel:

/home/goldbaum/.virtualenvs/yt-dev/local/lib/python2.7/site-packages/matplotlib/backends/backend_tkagg.pyc in new_figure_manager(num, *args, **kwargs)
82 FigureClass = kwargs.pop('FigureClass', Figure)
83 figure = FigureClass(*args, **kwargs)
---> 84 return new_figure_manager_given_figure(num, figure)
85
86

/home/goldbaum/.virtualenvs/yt-dev/local/lib/python2.7/site-packages/matplotlib/backends/backend_tkagg.pyc in new_figure_manager_given_figure(num, figure)
90 """
91 _focus = windowing.FocusManager()
---> 92 window = Tk.Tk()
93 window.withdraw()
94

/usr/lib/python2.7/lib-tk/Tkinter.pyc in __init__(self, screenName, baseName, className, useTk, sync, use)
1765 baseName = baseName + ext
1766 interactive = 0
-> 1767 self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
1768 if useTk:
1769 self._loadtk()

TclError: no display name and no $DISPLAY environment variable

I think it would be much nicer if backends somehow detected these sorts of errors, fell back to the Agg backend (probably with a warning) and then goes ahead and makes the plot.