human
3) Make a generic "Brushing" graph"
Please write code following the instructions in jupyter notebook style.

Can you provide a code to 3) Make a generic "Brushing" graph and the other steps required?
assistant
#Here is code to 3) Make a generic "Brushing" graph and the other steps required.

import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
from matplotlib.patches import Rectangle

import numpy as np
import plotly
import pandas as pd
import datashader
import seaborn as sns
import sys
import os

from bokeh.io import output_file, show
from bokeh.layouts import gridplot
from bokeh.models import ColumnDataSource
from bokeh.plotting import figure

%matplotlib notebook

flowers = pd.read_table("hw_2_data/flowers.csv", sep=",").set_index("species")

class DrawClass:

    def __init__(self, data, colors):
        """ Initialize the brusher plots
        
        data: pd.DataFrame - figure will have NxN subplots where N
                                is the number of features/columns 
        colors: np.ndarray - the colors group each row into categories 
                                accordingly
        """
        self.data = data
        self.colors = colors
        self.size = data.shape[1]
        self.fig, self.axes = plt.subplots(self.size, self.size)
        self.ax_data = {}
        self.ax_dict = {}
        self.active = np.array(data.shape[0])
        
        self.rect = None
        self.current_axes = None
        self.xy0 = None
        self.xy1 = None
        
        
        for x_ix, x_data in enumerate(self.data.columns):
            for y_ix, y_data in enumerate(self.data.columns):
                ax_temp = self.axes[y_ix, x_ix]
                scatterplot = ax_temp.scatter(data[x_data], data[y_data], alpha = 0.4)
                
                ax_temp.set_xlim(self.data[x_data].min(), self.data[x_data].max())
                ax_temp.set_ylim(self.data[y_data].min(), self.data[y_data].max())
                
                ax_temp.xaxis.set_ticks([])
                ax_temp.yaxis.set_ticks([])
                
                scatterplot.set_color(colors)
                
                self.ax_data[x_ix, y_ix] = scatterplot
                self.ax_dict[str(ax_temp)] = (x_data, y_data)
                
        
        self.cids = {}
       ...