def plot(self, region=None):
        # set up plotting grid
        self.fig = plt.figure(figsize=(10, 10))

        # main plots
        grid_size = (32, 15)
        hic_vmax_slider_ax = plt.subplot2grid(grid_size, (0, 0), colspan=13)
        hic_ax = plt.subplot2grid(grid_size, (1, 0), rowspan=9, colspan=13)
        hp_cax = plt.subplot2grid(grid_size, (1, 14), rowspan=9, colspan=1)
        tad_ax = plt.subplot2grid(grid_size, (10, 0), rowspan=1, colspan=13, sharex=hic_ax)
        line_ax = plt.subplot2grid(grid_size, (12, 0), rowspan=6, colspan=13, sharex=hic_ax)
        line_cax = plt.subplot2grid(grid_size, (12, 13), rowspan=6, colspan=2)
        data_vmax_slider_ax = plt.subplot2grid(grid_size, (19, 0), colspan=13)
        data_ax = plt.subplot2grid(grid_size, (20, 0), rowspan=9, colspan=13, sharex=hic_ax)
        da_cax = plt.subplot2grid(grid_size, (20, 14), rowspan=9, colspan=1)

        # buttons
        save_tads_ax = plt.subplot2grid(grid_size, (31, 0), rowspan=1, colspan=4)
        self.button_save_tads = Button(save_tads_ax, 'Save TADs')
        self.button_save_tads.on_clicked(self.on_click_save_tads)
        save_vector_ax = plt.subplot2grid(grid_size, (31, 5), rowspan=1, colspan=4)
        self.button_save_vector = Button(save_vector_ax, 'Save current values')
        self.button_save_vector.on_clicked(self.on_click_save_vector)
        save_matrix_ax = plt.subplot2grid(grid_size, (31, 10), rowspan=1, colspan=4)
        self.button_save_matrix = Button(save_matrix_ax, 'Save matrix')
        self.button_save_matrix.on_clicked(self.on_click_save_matrix)

        # add subplot content
        max_value = np.nanpercentile(self.hic_matrix, self.max_percentile)
        init_value = .2*max_value

        # HI-C VMAX SLIDER
        self.svmax = Slider(hic_vmax_slider_ax, 'vmax', self.min_value, max_value, valinit=init_value, color='grey')
        self.svmax.on_changed(self.vmax_slider_update)

        # HI-C
        self.hic_plot = HicPlot(self.hic_matrix, self.regions, max_dist=self.max_dist, norm=self.norm,
                                vmax=init_value, vmin=self.min_value, colormap=self.matrix_colormap)
        self.hic_plot.plot(region, ax=hic_ax, cax=hp_cax)

        # generate data array
        self.min_value_data = np.nanmin(self.da[np.nonzero(self.da)])
        max_value_data = np.nanpercentile(self.da, self.max_percentile)
        init_value_data = .5*max_value_data

        # LINE PLOT
        da_ix = int(self.da.shape[0]/2)
        self.current_da_ix = da_ix
        self.line_plot = DataLinePlot(self.da, regions=self.regions, init_row=da_ix, is_symmetric=self.is_symmetric)
        self.line_plot.plot(region, ax=line_ax)
        self.line_ax = line_ax

        # line info
        self.current_window_size = self.ws[da_ix]
        line_cax.text(.1, .8, 'Window size', fontweight='bold')
        self.window_size_text = line_cax.text(.3, .6, str(self.current_window_size))
        line_cax.text(.1, .4, 'TAD cutoff', fontweight='bold')
        self.tad_cutoff_text = line_cax.text(.3, .2, "%.5f" % self.line_plot.current_cutoff)
        line_cax.axis('off')

        # TAD PLOT
        self.tad_regions = self.tad_calling_algorithm(self.da[da_ix], self.line_plot.current_cutoff, self.regions)

        self.tad_plot = TADPlot(self.tad_regions)
        self.tad_plot.plot(region=region, ax=tad_ax)

        # DATA ARRAY
        self.data_plot = DataArrayPlot(self.da, self.ws, self.regions, vmax=init_value_data,
                                       colormap=self.data_plot_color, current_window_size=self.ws[da_ix],
                                       log_y=self.log_data)
        self.data_plot.plot(region, ax=data_ax, cax=da_cax)

        # DATA ARRAY SLIDER
        if self.is_symmetric:
            self.sdata = Slider(data_vmax_slider_ax, 'vmax', 0.0, max_value_data,
                                valinit=init_value_data, color='grey')
        else:
            self.sdata = Slider(data_vmax_slider_ax, 'vmax', self.min_value_data, max_value_data,
                                valinit=init_value_data, color='grey')

        self.sdata.on_changed(self.data_slider_update)
        self.data_slider_update(init_value_data)

        # clean up
        hic_ax.xaxis.set_visible(False)
        line_ax.xaxis.set_visible(False)

        # enable hover
        self.data_ax = data_ax
        cid = self.fig.canvas.mpl_connect('button_press_event', self.on_click)

        return self.fig, (hic_vmax_slider_ax, hic_ax, line_ax, data_ax, hp_cax, da_cax)