def crossplot_filters(self, filter_string, analytes=None,<EOL>samples=None, subset=None, filt=None):
if analytes is None:<EOL><INDENT>analytes = [a for a in self.analytes if self.internal_standard not in a]<EOL><DEDENT>if samples is None:<EOL><INDENT>samples = self._get_samples(subset)<EOL><DEDENT>filts = self.data[samples[<NUM_LIT:0>]].filt.components.keys()<EOL>cfilts = [f for f in filts if filter_string in f]<EOL>flab = re.compile('<STR_LIT>')  <EOL>self.get_focus(subset=subset, filt=filt)<EOL>numvars = len(analytes)<EOL>fig, axes = plt.subplots(nrows=numvars, ncols=numvars,<EOL>figsize=(<NUM_LIT:12>, <NUM_LIT:12>))<EOL>fig.subplots_adjust(hspace=<NUM_LIT>, wspace=<NUM_LIT>)<EOL>for ax in axes.flat:<EOL><INDENT>ax.xaxis.set_visible(False)<EOL>ax.yaxis.set_visible(False)<EOL>if ax.is_first_col():<EOL><INDENT>ax.yaxis.set_ticks_position('<STR_LIT:left>')<EOL><DEDENT>if ax.is_last_col():<EOL><INDENT>ax.yaxis.set_ticks_position('<STR_LIT:right>')<EOL><DEDENT>if ax.is_first_row():<EOL><INDENT>ax.xaxis.set_ticks_position('<STR_LIT>')<EOL><DEDENT>if ax.is_last_row():<EOL><INDENT>ax.xaxis.set_ticks_position('<STR_LIT>')<EOL><DEDENT><DEDENT>cmlist = ['<STR_LIT>', '<STR_LIT>', '<STR_LIT>', '<STR_LIT>',<EOL>'<STR_LIT>', '<STR_LIT>', '<STR_LIT>', '<STR_LIT>',<EOL>'<STR_LIT>', '<STR_LIT>', '<STR_LIT>', '<STR_LIT>',<EOL>'<STR_LIT>', '<STR_LIT>', '<STR_LIT>', '<STR_LIT>', '<STR_LIT>', '<STR_LIT>']<EOL>focus = {k: nominal_values(v) for k, v in self.focus.items()}<EOL>udict = {a: unitpicker(np.nanmean(focus[a]),<EOL>focus_stage=self.focus_stage,<EOL>denominator=self.internal_standard) for a in analytes}<EOL>rdict = {a: (np.nanmin(focus[a] * udict[a][<NUM_LIT:0>]),<EOL>np.nanmax(focus[a] * udict[a][<NUM_LIT:0>])) for a in analytes}<EOL>for f in cfilts:<EOL><INDENT>self.get_focus(f, subset=subset)<EOL>focus = {k: nominal_values(v) for k, v in self.focus.items()}<EOL>lab = flab.match(f).groups()[<NUM_LIT:0>]<EOL>axes[<NUM_LIT:0>, <NUM_LIT:0>].scatter([], [], s=<NUM_LIT:10>, label=lab)<EOL>for i, j in zip(*np.triu_indices_from(axes, k=<NUM_LIT:1>)):<EOL><INDENT>ai = analytes[i]<EOL>aj = analytes[j]<EOL>pi = focus[ai][~np.isnan(focus[ai])] * udict[ai][<NUM_LIT:0>]<EOL>pj = focus[aj][~np.isnan(focus[aj])] * udict[aj][<NUM_LIT:0>]<EOL>axes[i, j].scatter(pj, pi, alpha=<NUM_LIT>, s=<NUM_LIT:10>, lw=<NUM_LIT:0.5>, edgecolor='<STR_LIT:k>')<EOL>axes[j, i].scatter(pi, pj, alpha=<NUM_LIT>, s=<NUM_LIT:10>, lw=<NUM_LIT:0.5>, edgecolor='<STR_LIT:k>')<EOL>axes[i, j].set_ylim(*rdict[ai])<EOL>axes[i, j].set_xlim(*rdict[aj])<EOL>axes[j, i].set_ylim(*rdict[aj])<EOL>axes[j, i].set_xlim(*rdict[ai])<EOL><DEDENT><DEDENT>for a, n in zip(analytes, np.arange(len(analytes))):<EOL><INDENT>axes[n, n].annotate(a + '<STR_LIT:\n>' + udict[a][<NUM_LIT:1>], (<NUM_LIT:0.5>, <NUM_LIT:0.5>),<EOL>xycoords='<STR_LIT>',<EOL>ha='<STR_LIT>', va='<STR_LIT>')<EOL>axes[n, n].set_xlim(*rdict[a])<EOL>axes[n, n].set_ylim(*rdict[a])<EOL><DEDENT>axes[<NUM_LIT:0>, <NUM_LIT:0>].legend(loc='<STR_LIT>', title=filter_string)<EOL>for i, j in zip(range(numvars), itertools.cycle((-<NUM_LIT:1>, <NUM_LIT:0>))):<EOL><INDENT>axes[j, i].xaxis.set_visible(True)<EOL>for label in axes[j, i].get_xticklabels():<EOL><INDENT>label.set_rotation(<NUM_LIT>)<EOL><DEDENT>axes[i, j].yaxis.set_visible(True)<EOL><DEDENT>return fig, axes<EOL>
Plot the results of a group of filters in a crossplot.

Parameters
----------
filter_string : str
    A string that identifies a group of filters.
    e.g. 'test' would plot all filters with 'test' in the
    name.
analytes : optional, array_like or str
    The analyte(s) to plot. Defaults to all analytes.

Returns
-------
fig, axes objects