//  [python]
def plot_eui_boxplots_by_building_type(self, df, column_for_grouping, color_map, output_dir):
        # EUI box plot comparisons by building type and several disaggregations

        # Columns to summarize
        cols_to_summarize = [
            self.col_name_to_eui(self.ANN_TOT_ENGY_KBTU),
            self.col_name_to_eui(self.ANN_TOT_ELEC_KBTU),
            self.col_name_to_eui(self.ANN_TOT_GAS_KBTU),
        ]

        # Disaggregate to these levels
        group_bys = [
            None,
            self.CEN_DIV,
            # self.FLR_AREA_CAT, TODO reenable after adding to both CBECS and ComStock
            # self.VINTAGE,
        ]

        for col in cols_to_summarize:
            for bldg_type, bldg_type_ts_df in df.groupby(self.BLDG_TYPE):

                # Make a plot for each group
                for group_by in group_bys:
                    if group_by is None:
                        # No group-by
                        g = sns.catplot(
                            data=bldg_type_ts_df,
                            y=column_for_grouping,
                            hue=column_for_grouping,
                            x=col,
                            order=list(color_map.keys()),
                            palette=color_map.values(),
                            kind='box',
                            orient='h',
                            fliersize=0,
                            showmeans=True,
                            meanprops={"marker":"d",
                                "markerfacecolor":"yellow",
                                "markeredgecolor":"black",
                                "markersize":"8"
                            },
                            legend=False
                        )
                    else:
                        # With group-by
                        g = sns.catplot(
                            data=bldg_type_ts_df,
                            x=col,
                            hue=column_for_grouping,
                            y=group_by,
                            order=self.ORDERED_CATEGORIES[group_by],
                            hue_order=list(color_map.keys()),
                            palette=color_map.values(),
                            kind='box',
                            orient='h',
                            fliersize=0,
                            showmeans=True,
                            meanprops={"marker":"d",
                                "markerfacecolor":"yellow",
                                "markeredgecolor":"black",
                                "markersize":"8"
                            },
                            aspect=2
                        )
                        g._legend.set_title(self.col_name_to_nice_name(column_for_grouping))

                    fig = g.figure

                    # Extract the units from the column name
                    units = self.nice_units(self.units_from_col_name(col))

                    # Titles and axis labels
                    col_title = self.col_name_to_nice_name(col)
                    # col_title = col.replace(f' {units}', '')
                    # col_title = col_title.replace('Normalized Annual ', '')
                    fuel = self.col_name_to_fuel(col_title)

                    # Formatting
                    if group_by is None:
                        # No group-by
                        title = f"Boxplot of {col_title}\n for {bldg_type.replace('_', ' ')}".title()
                        for ax in g.axes.flatten():
                            ax.set_xlabel(f'{fuel} EUI ({units})')
                            ax.set_ylabel('')
                    else:
                        # With group-by
                        gb = self.col_name_to_nice_name(group_by)
                        title = f"Boxplot of {col_title}\n for {bldg_type.replace('_', ' ')} by {f'{gb}'}".title()
                        for ax in g.axes.flatten():
                            ax.set_xlabel(f'{fuel} EUI ({units})')
                            ax.set_ylabel(f'{gb}')

                    # Save figure
                    title = title.replace('\n', '')
                    fig_name = f'{title.replace(" ", "_").lower()}.{self.image_type}'
                    fig_name = fig_name.replace('boxplot_of_', 'bp_')
                    fig_name = fig_name.replace('total_energy_consumption_', '')
                    fig_sub_dir = os.path.abspath(os.path.join(output_dir, bldg_type))
                    if not os.path.exists(fig_sub_dir):
                        os.makedirs(fig_sub_dir)
                    fig_path = os.path.abspath((os.path.join(fig_sub_dir, fig_name)))
                    plt.savefig(fig_path, bbox_inches = 'tight')
                    plt.close()