def scatter(self, column_for_x, select=None, overlay=True, fit_line=False,<EOL>colors=None, labels=None, sizes=None, width=<NUM_LIT:5>, height=<NUM_LIT:5>, s=<NUM_LIT:20>, **vargs):
options = self.default_options.copy()<EOL>options.update(vargs)<EOL>x_data, y_labels =  self._split_column_and_labels(column_for_x)<EOL>if colors is not None:<EOL><INDENT>y_labels.remove(self._as_label(colors))<EOL><DEDENT>if sizes is not None:<EOL><INDENT>y_labels.remove(self._as_label(sizes))<EOL><DEDENT>if select is not None:<EOL><INDENT>y_labels = self._as_labels(select)<EOL><DEDENT>if len(y_labels) > <NUM_LIT:1> and colors is not None and overlay:<EOL><INDENT>warnings.warn("<STR_LIT>")<EOL>overlay = False<EOL><DEDENT>def draw(axis, label, color):<EOL><INDENT>if colors is not None:<EOL><INDENT>colored = sorted(np.unique(self.column(colors)))<EOL>color_list = list(itertools.islice(itertools.cycle(self.chart_colors), len(colored)))<EOL>color_map = collections.OrderedDict(zip(colored, color_list))<EOL>color = [color_map[x] for x in self.column(colors)]<EOL><DEDENT>elif '<STR_LIT>' in options:<EOL><INDENT>color = options.pop('<STR_LIT>')<EOL><DEDENT>y_data = self[label]<EOL>if sizes is not None:<EOL><INDENT>max_size = max(self[sizes]) ** <NUM_LIT:0.5><EOL>size = <NUM_LIT:2> * s * self[sizes] ** <NUM_LIT:0.5> / max_size<EOL><DEDENT>else:<EOL><INDENT>size = s<EOL><DEDENT>axis.scatter(x_data, y_data, color=color, s=size, **options)<EOL>if fit_line:<EOL><INDENT>m, b = np.polyfit(x_data, self[label], <NUM_LIT:1>)<EOL>minx, maxx = np.min(x_data),np.max(x_data)<EOL>axis.plot([minx,maxx],[m*minx+b,m*maxx+b], color=color)<EOL><DEDENT>if labels is not None:<EOL><INDENT>for x, y, label in zip(x_data, y_data, self[labels]):<EOL><INDENT>axis.annotate(label, (x, y),<EOL>xytext=(-<NUM_LIT:20>, <NUM_LIT:20>),<EOL>textcoords='<STR_LIT>', ha='<STR_LIT:right>', va='<STR_LIT>',<EOL>bbox=dict(boxstyle='<STR_LIT>', fc='<STR_LIT>', alpha=<NUM_LIT>),<EOL>arrowprops = dict(arrowstyle = '<STR_LIT>', connectionstyle = '<STR_LIT>', color='<STR_LIT>'))<EOL><DEDENT><DEDENT>if colors is not None:<EOL><INDENT>import matplotlib.patches as mpatches<EOL>patches = [mpatches.Patch(color=c, label=v) for (v, c) in color_map.items()]<EOL>axis.legend(loc=<NUM_LIT:2>, bbox_to_anchor=(<NUM_LIT>, <NUM_LIT:1>), handles=patches)<EOL><DEDENT><DEDENT>x_label = self._as_label(column_for_x)<EOL>self._visualize(x_label, y_labels, None, overlay, draw, _vertical_x, width=width, height=height)<EOL>
Creates scatterplots, optionally adding a line of best fit.

        Args:
            ``column_for_x`` (``str``): The column to use for the x-axis values
                and label of the scatter plots.

        Kwargs:
            ``overlay`` (``bool``): If true, creates a chart with one color
                per data column; if False, each plot will be displayed separately.

            ``fit_line`` (``bool``): draw a line of best fit for each set of points.

            ``vargs``: Additional arguments that get passed into `plt.scatter`.
                See http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.scatter
                for additional arguments that can be passed into vargs. These
                include: `marker` and `norm`, to name a couple.

            ``colors``: A column of categories to be used for coloring dots.

            ``labels``: A column of text labels to annotate dots.

            ``sizes``:  A column of values to set the relative areas of dots.

            ``s``: Size of dots. If sizes is also provided, then dots will be
              in the range 0 to 2 * s.

        Raises:
            ValueError -- Every column, ``column_for_x`` or ``select``, must be numerical

        Returns:
            Scatter plot of values of ``column_for_x`` plotted against
            values for all other columns in self. Each plot uses the values in
            `column_for_x` for horizontal positions. One plot is produced for
            all other columns in self as y (or for the columns designated by
            `select`).


        >>> table = Table().with_columns(
        ...     'x', make_array(9, 3, 3, 1),
        ...     'y', make_array(1, 2, 2, 10),
        ...     'z', make_array(3, 4, 5, 6))
        >>> table
        x    | y    | z
        9    | 1    | 3
        3    | 2    | 4
        3    | 2    | 5
        1    | 10   | 6
        >>> table.scatter('x') # doctest: +SKIP
        <scatterplot of values in y and z on x>

        >>> table.scatter('x', overlay=False) # doctest: +SKIP
        <scatterplot of values in y on x>
        <scatterplot of values in z on x>

        >>> table.scatter('x', fit_line=True) # doctest: +SKIP
        <scatterplot of values in y and z on x with lines of best fit>