docs: def input_ip_plots(iparr, inputarr, diffed, x, sort_ind,
                     prefix=None, limits1=(None, None), limits2=(None, None),
                     hlines=None, vlines=None):
  
      """
      All-in-one plotting function to make a 5-panel figure.
  
      Panels are IP, input, and diffed; plus 2 line plots showing averages.
  
      :param iparr, inputarr: NumPy arrays constructed by a genomic_signal object
      :param diffed: Difference of `iparr` and `inputarr`, but can be some other
                     transformation.
      :param x: Extent to use -- for TSSs, maybe something like
          np.linspace(-1000, 1000, bins), or for just bin IDs, something like
          `np.arange(bins)`.
  
      :param sort_ind: row order for each of the 3 panels -- usually interesting
          to use `clustered_sortind` or `tip_zscores`
  
      :param prefix: Used to prefix plot titles with '%(prefix)s IP", etc
      :param limits1: Tuple passed to the Normalize function for IP and input.
      :param limits2: Tuple passed tot he Normalize function for the diffed array
      :param hlines: List of (position, kwarg) tuples for plotting horizontal
          lines.  Kwargs are passed directly to axhline. Useful for delimiting
          clusters, if you used `clustered_sortind` and have both `row_order` and
          `breaks`.
      :param vlines: List of (position, kwargs) tuples.  A vertical line will be
          plotted at each position using kwargs.
      """
  
      # global min and max
      gmin = min(iparr.min(), inputarr.min())
      gmax = max(iparr.max(), inputarr.max())
  
      fig = plt.figure(figsize=(10, 10))
  
      # 3 arrays, 2 line plots, a gene strip, and 2 colorbars.  Plots share the
      # axes that make sense
      #
      # 3 arrays
      ax1 = plt.subplot2grid(
          (9, 9), (0, 0), colspan=3, rowspan=6)
      ax2 = plt.subplot2grid(
          (9, 9), (0, 3), colspan=3, rowspan=6, sharex=ax1, sharey=ax1)
      ax3 = plt.subplot2grid(
          (9, 9), (0, 6), colspan=3, rowspan=6, sharex=ax1, sharey=ax1)
  
      # 2 line plots
      ax4 = plt.subplot2grid((9, 9), (6, 3), colspan=3, rowspan=3, sharex=ax1)
      ax5 = plt.subplot2grid((9, 9), (6, 6), colspan=3, rowspan=3, sharex=ax1)
  
      # 2 colorbars
      cax1 = plt.Axes(fig, rect=(0.05, 0.25, 0.25, 0.025))
      cax2 = plt.Axes(fig, rect=(0.05, 0.15, 0.25, 0.025))
  
      # For nice imshow axes
      extent = (min(x), max(x), 0, diffed.shape[0])
  
      cm = matplotlib.cm.gist_gray
      cm.set_bad('k')
      cm.set_over('r')
      cm.set_under('b')
  
      limits1 = list(limits1)
      limits2 = list(limits2)
  
      all_base = np.column_stack((iparr.ravel(), inputarr.ravel())).ravel()
  
      if limits1[0] is None:
          limits1[0] = mlab.prctile(
              all_base, 1. / all_base.size)
      if limits1[1] is None:
          limits1[1] = mlab.prctile(
              all_base, 100 - 1. / all_base.size)
      if limits2[0] is None:
          limits2[0] = mlab.prctile(
              diffed.ravel(), 1. / all_base.size)
      if limits2[1] is None:
          limits2[1] = mlab.prctile(
              diffed.ravel(), 100 - 1. / all_base.size)
  
      del all_base
  
      imshow_kwargs = dict(
          interpolation='nearest',
          aspect='auto',
          cmap=cm,
          norm=matplotlib.colors.Normalize(*limits1),
          extent=extent,
          origin='lower')
  
      # modify kwargs for diffed (by changing the normalization)
      diffed_kwargs = imshow_kwargs.copy()
      diffed_kwargs['norm'] = matplotlib.colors.Normalize(*limits2)
  
      # IP
      mappable1 = ax1.imshow(iparr[sort_ind, :], **imshow_kwargs)
  
      # input
      mappable2 = ax2.imshow(inputarr[sort_ind, :], **imshow_kwargs)
  
      # diffed
      mappable3 = ax3.imshow((diffed)[sort_ind, :], **diffed_kwargs)
  
      # IP and input line plot with vertical line
      ax4.plot(x, inputarr.mean(axis=0), color='k', linestyle='--',
               label='input')
      ax4.plot(x, iparr.mean(axis=0), color='k', label='ip')
      ax4.axvline(0, color='k', linestyle=':')
  
      # Diffed line plot with vertical line
      ax5.plot(x, diffed.mean(axis=0), 'k', label='enrichment')
      ax5.axvline(0, color='k', linestyle=':')
  
      # Colorbars
      cbar1 = fig.colorbar(mappable1, cax1, orientation='horizontal')
      cbar2 = fig.colorbar(mappable3, cax2, orientation='horizontal')
      fig.add_axes(cax1)
      fig.add_axes(cax2)
  
      # labeling...
      ax1.set_ylabel('features')
      plt.setp(ax2.get_yticklabels(), visible=False)
      plt.setp(ax3.get_yticklabels(), visible=False)
      ax4.set_xlabel('bp')
      ax4.set_ylabel('mean reads per million mapped reads')
      ax5.set_xlabel('bp')
      cax1.set_xlabel('Reads per million mapped reads')
      cax2.set_xlabel('Enrichment (RPMMR)')
  
      if prefix is None:
          prefix = ""
      ax1.set_title('%s IP' % prefix)
      ax2.set_title('%s input' % prefix)
      ax3.set_title('Difference')
  
      # diffed line plot should have y ax on right
      ax5.yaxis.set_ticks_position('right')
      ax5.yaxis.set_label_position('right')
      ax5.set_ylabel('enriched reads per million mapped reads')
  
      # Legends
      ax4.legend(loc='best', frameon=False)
      ax5.legend(loc='best', frameon=False)
  
      # Make sure everybody snaps to xmin/xmax
      for ax in [ax1, ax2, ax3, ax4, ax5]:
          ax.axis(xmin=extent[0], xmax=extent[1])
  
      if not hlines:
          hlines = []
      if not vlines:
          vlines = []
  
      for ax in [ax1, ax2, ax3]:
          for pos, kwargs in hlines:
              ax.axhline(pos, **kwargs)
          for pos, kwargs in vlines:
              ax.axvline(pos, **kwargs)
  
      fig.subplots_adjust(bottom=0.05, top=0.95, hspace=0.75, wspace=0.9)
  
      return fig