title: Using matplotlib on non-0 MPI rank causes "QXcbConnection: Could not connect to display"
body: <p>I have written a program that uses mpi4py to do some job (making an array) in the node of rank 0 in the following code. Then it makes another array in the node of rank 1. Then I plot both the arrays. The array in node 0 is broad casted to node 1. However the code gives a bizarre error.
  I used the following command:</p>
  
  <pre><code>mpiexec -n 2 -f mfile python mpi_test_4.py
  </code></pre>
  
  <p>The program goes as:</p>
  
  <pre><code>from mpi4py import MPI
  import matplotlib.pyplot as plt
  import numpy as np
  
  comm = MPI.COMM_WORLD
  rank = comm.rank
  
  
  x = np.linspace(-2*np.pi,2*np.pi,100)
  if (rank == 0 ):
      y1 = np.sin(x)
  else:
      y1 = None
  y1 = comm.bcast(y1,root=0)
  if ( rank == 1 ):
      y2 = np.cos(x)
      fig = plt.figure()
      ax = fig.gca()
      ax.plot(x,y1)  
      ax.plot(x,y2)
      plt.savefig('test.png')
  
  print(rank)
  </code></pre>
  
  <p>Error message is:</p>
  
  <pre><code>0
  QXcbConnection: Could not connect to display 
  
  ===================================================================================
  =   BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES
  =   PID 6804 RUNNING AT 192.168.1.106
  =   EXIT CODE: 134
  =   CLEANING UP REMAINING PROCESSES
  =   YOU CAN IGNORE THE BELOW CLEANUP MESSAGES
  ===================================================================================
  [proxy:0:0@alankar-Aspire-E5-571] HYD_pmcd_pmip_control_cmd_cb (/home/alankar/mpich3/mpich-3.2/src/pm/hydra/pm/pmiserv/pmip_cb.c:885): assert (!closed) failed
  [proxy:0:0@alankar-Aspire-E5-571] HYDT_dmxu_poll_wait_for_event (/home/alankar/mpich3/mpich-3.2/src/pm/hydra/tools/demux/demux_poll.c:76): callback returned error status
  [proxy:0:0@alankar-Aspire-E5-571] main (/home/alankar/mpich3/mpich-3.2/src/pm/hydra/pm/pmiserv/pmip.c:206): demux engine error waiting for event
  [mpiexec@alankar-Aspire-E5-571] HYDT_bscu_wait_for_completion (/home/alankar/mpich3/mpich-3.2/src/pm/hydra/tools/bootstrap/utils/bscu_wait.c:76): one of the processes terminated badly; aborting
  [mpiexec@alankar-Aspire-E5-571] HYDT_bsci_wait_for_completion (/home/alankar/mpich3/mpich-3.2/src/pm/hydra/tools/bootstrap/src/bsci_wait.c:23): launcher returned error waiting for completion
  [mpiexec@alankar-Aspire-E5-571] HYD_pmci_wait_for_completion (/home/alankar/mpich3/mpich-3.2/src/pm/hydra/pm/pmiserv/pmiserv_pmci.c:218): launcher returned error waiting for completion
  [mpiexec@alankar-Aspire-E5-571] main (/home/alankar/mpich3/mpich-3.2/src/pm/hydra/ui/mpich/mpiexec.c:344): process manager error waiting for completion
  </code></pre>
  
  <p>However when I plot on node 0 which is the node I am using to issue the command: mpiexec -n 2 -f mfile python mpi_test_4.py the code works. For example this:</p>
  
  <pre><code>from mpi4py import MPI
  import matplotlib.pyplot as plt
  import numpy as np
  
  comm = MPI.COMM_WORLD
  rank = comm.rank
  
  
  x = np.linspace(-2*np.pi,2*np.pi,100)
  if (rank == 1 ):
      y1 = np.sin(x)
  else:
      y1 = None
  y1 = comm.bcast(y1,root=1)
  if ( rank == 0 ):
      y2 = np.cos(x)
      fig = plt.figure()
      ax = fig.gca()
      ax.plot(x,y1)  
      ax.plot(x,y2)
      plt.savefig('test.png')
  
  print(rank)
  </code></pre>