Beispiel #1
0
    def initialize_chart(self):
        self.tooltip = False
        x_attr = self.view.get_attr_by_channel("x")[0]
        y_attr = self.view.get_attr_by_channel("y")[0]

        self.code += "import altair as alt\n"
        # self.code += f"visData = pd.DataFrame({str(self.data.to_dict(orient='records'))})\n"
        self.code += f"visData = pd.DataFrame({str(self.data.to_dict())})\n"

        if (x_attr.data_model == "measure"):
            agg_title = get_agg_title(x_attr)
            y_attr_field = alt.Y(y_attr.attribute,
                                 type=y_attr.data_type,
                                 axis=alt.Axis(labelOverlap=True))
            x_attr_field = alt.X(x_attr.attribute,
                                 type=x_attr.data_type,
                                 title=agg_title)
            y_attr_field_code = f"alt.Y('{y_attr.attribute}', type= '{y_attr.data_type}', axis=alt.Axis(labelOverlap=True))"
            x_attr_field_code = f"alt.X('{x_attr.attribute}', type= '{x_attr.data_type}', title='{agg_title}')"

            if (y_attr.sort == "ascending"):
                y_attr_field.sort = "-x"
                y_attr_field_code = f"alt.Y('{y_attr.attribute}', type= '{y_attr.data_type}', axis=alt.Axis(labelOverlap=True), sort ='-x')"
        else:
            agg_title = get_agg_title(y_attr)
            x_attr_field = alt.X(x_attr.attribute,
                                 type=x_attr.data_type,
                                 axis=alt.Axis(labelOverlap=True))
            y_attr_field = alt.Y(y_attr.attribute,
                                 type=y_attr.data_type,
                                 title=agg_title)
            x_attr_field_code = f"alt.X('{x_attr.attribute}', type= '{x_attr.data_type}', axis=alt.Axis(labelOverlap=True))"
            y_attr_field_code = f"alt.Y('{y_attr.attribute}', type= '{y_attr.data_type}', title='{agg_title}')"
            if (x_attr.sort == "ascending"):
                x_attr_field.sort = "-y"
                x_attr_field_code = f"alt.X('{x_attr.attribute}', type= '{x_attr.data_type}', axis=alt.Axis(labelOverlap=True),sort='-y')"

        chart = alt.Chart(self.data).mark_bar().encode(y=y_attr_field,
                                                       x=x_attr_field)
        # TODO: tooltip messes up the count() bar charts
        # Can not do interactive whenever you have default count measure otherwise output strange error (Javascript Error: Cannot read property 'length' of undefined)
        #chart = chart.interactive() # If you want to enable Zooming and Panning
        chart = chart.configure_mark(tooltip=alt.TooltipContent(
            'encoding'))  # Setting tooltip as non-null

        self.code += f'''
		chart = alt.Chart(visData).mark_bar().encode(
		    y = {y_attr_field_code},
		    x = {x_attr_field_code},
		)
		chart = chart.configure_mark(tooltip=alt.TooltipContent('encoding')) # Setting tooltip as non-null
		'''
        return chart
Beispiel #2
0
    def initialize_chart(self):
        self.tooltip = False  # tooltip looks weird for line chart
        x_attr = self.vis.get_attr_by_channel("x")[0]
        y_attr = self.vis.get_attr_by_channel("y")[0]

        x_attr_abv = x_attr.attribute
        y_attr_abv = y_attr.attribute

        if len(x_attr.attribute) > 25:
            x_attr_abv = x_attr.attribute[:15] + "..." + x_attr.attribute[-10:]
        if len(y_attr.attribute) > 25:
            y_attr_abv = y_attr.attribute[:15] + "..." + y_attr.attribute[-10:]

        x_attr.attribute = x_attr.attribute.replace(".", "")
        y_attr.attribute = y_attr.attribute.replace(".", "")

        # Remove NaNs only for Line Charts (offsets axis range)
        self.data = self.data.dropna(subset=[x_attr.attribute, y_attr.attribute])
        self.code += "import altair as alt\n"
        self.code += "import pandas._libs.tslibs.timestamps\n"
        self.code += "from pandas._libs.tslibs.timestamps import Timestamp\n"
        self.code += f"visData = pd.DataFrame({str(self.data.to_dict())})\n"

        if y_attr.data_model == "measure":
            agg_title = get_agg_title(y_attr)
            x_attr_spec = alt.X(x_attr.attribute, type=x_attr.data_type, axis=alt.Axis(title=x_attr_abv))
            y_attr_spec = alt.Y(
                y_attr.attribute, type=y_attr.data_type, title=agg_title, axis=alt.Axis(title=y_attr_abv)
            )
            x_attr_field_code = f"alt.X('{x_attr.attribute}', type = '{x_attr.data_type}', axis=alt.Axis(title='{x_attr_abv}'))"
            y_attr_fieldCode = f"alt.Y('{y_attr.attribute}', type= '{y_attr.data_type}', title='{agg_title}', axis=alt.Axis(title='{y_attr_abv}')"
        else:
            agg_title = get_agg_title(x_attr)
            x_attr_spec = alt.X(
                x_attr.attribute, type=x_attr.data_type, title=agg_title, axis=alt.Axis(title=x_attr_abv)
            )
            y_attr_spec = alt.Y(y_attr.attribute, type=y_attr.data_type, axis=alt.Axis(title=y_attr_abv))
            x_attr_field_code = f"alt.X('{x_attr.attribute}', type = '{x_attr.data_type}', title='{agg_title}', axis=alt.Axis(title='{x_attr_abv}')"
            y_attr_fieldCode = f"alt.Y('{y_attr.attribute}', type= '{y_attr.data_type}', axis=alt.Axis(title='{u_attr_abv}')"

        chart = alt.Chart(self.data).mark_line().encode(x=x_attr_spec, y=y_attr_spec)
        chart = chart.interactive()  # Enable Zooming and Panning
        self.code += f"""
		chart = alt.Chart(visData).mark_line().encode(
		    y = {y_attr_fieldCode},
		    x = {x_attr_field_code},
		)
		chart = chart.interactive() # Enable Zooming and Panning
		"""
        return chart
Beispiel #3
0
    def initialize_chart(self):
        self.tooltip = False  # tooltip looks weird for line chart
        x_attr = self.vis.get_attr_by_channel("x")[0]
        y_attr = self.vis.get_attr_by_channel("y")[0]

        self.code += "import altair as alt\n"
        self.code += "import pandas._libs.tslibs.timestamps\n"
        self.code += "from pandas._libs.tslibs.timestamps import Timestamp\n"
        self.code += f"visData = pd.DataFrame({str(self.data.to_dict())})\n"

        if y_attr.data_model == "measure":
            agg_title = get_agg_title(y_attr)
            x_attr_spec = alt.X(x_attr.attribute, type=x_attr.data_type)
            y_attr_spec = alt.Y(y_attr.attribute,
                                type=y_attr.data_type,
                                title=agg_title)
            x_attr_field_code = f"alt.X('{x_attr.attribute}', type = '{x_attr.data_type}')"
            y_attr_fieldCode = (
                f"alt.Y('{y_attr.attribute}', type= '{y_attr.data_type}', title='{agg_title}')"
            )
        else:
            agg_title = get_agg_title(x_attr)
            x_attr_spec = alt.X(x_attr.attribute,
                                type=x_attr.data_type,
                                title=agg_title)
            y_attr_spec = alt.Y(y_attr.attribute, type=y_attr.data_type)
            x_attr_field_code = (
                f"alt.X('{x_attr.attribute}', type = '{x_attr.data_type}', title='{agg_title}')"
            )
            y_attr_fieldCode = f"alt.Y('{y_attr.attribute}', type= '{y_attr.data_type}')"

        chart = alt.Chart(self.data).mark_line().encode(x=x_attr_spec,
                                                        y=y_attr_spec)
        chart = chart.interactive()  # Enable Zooming and Panning
        self.code += f"""
		chart = alt.Chart(visData).mark_line().encode(
		    y = {y_attr_fieldCode},
		    x = {x_attr_field_code},
		)
		chart = chart.interactive() # Enable Zooming and Panning
		"""
        return chart
Beispiel #4
0
    def initialize_chart(self):
        self.tooltip = False
        x_attr = self.vis.get_attr_by_channel("x")[0]
        y_attr = self.vis.get_attr_by_channel("y")[0]

        x_attr_abv = str(x_attr.attribute)
        y_attr_abv = str(y_attr.attribute)

        if len(x_attr_abv) > 25:
            x_attr_abv = x_attr.attribute[:15] + "..." + x_attr.attribute[-10:]
        if len(y_attr_abv) > 25:
            y_attr_abv = y_attr.attribute[:15] + "..." + y_attr.attribute[-10:]
        if isinstance(x_attr.attribute, str):
            x_attr.attribute = x_attr.attribute.replace(".", "")
        if isinstance(y_attr.attribute, str):
            y_attr.attribute = y_attr.attribute.replace(".", "")
        # To get datetime to display correctly on bar charts
        if x_attr.data_type == "temporal":
            x_attr.data_type = "nominal"
            self.code += "from pandas import Timestamp\n"
        if y_attr.data_type == "temporal":
            y_attr.data_type = "nominal"
            self.code += "from pandas import Timestamp\n"

        if x_attr.data_model == "measure":
            agg_title = get_agg_title(x_attr)
            measure_attr = x_attr.attribute
            y_attr_field = alt.Y(
                str(y_attr.attribute),
                type=y_attr.data_type,
                axis=alt.Axis(labelOverlap=True, title=y_attr_abv),
            )
            x_attr_field = alt.X(
                str(x_attr.attribute),
                type=x_attr.data_type,
                title=agg_title,
                axis=alt.Axis(title=agg_title),
            )
            y_attr_field_code = f"alt.Y('{y_attr.attribute}', type= '{y_attr.data_type}', axis=alt.Axis(labelOverlap=True, title='{y_attr_abv}'))"
            x_attr_field_code = f"alt.X('{x_attr.attribute}', type= '{x_attr.data_type}', title='{agg_title}', axis=alt.Axis(title='{agg_title}'))"

            if y_attr.sort == "ascending":
                y_attr_field.sort = "-x"
                y_attr_field_code = f"alt.Y('{y_attr.attribute}', type= '{y_attr.data_type}', axis=alt.Axis(labelOverlap=True, title='{y_attr_abv}'), sort ='-x')"
        else:
            agg_title = get_agg_title(y_attr)
            measure_attr = y_attr.attribute
            x_attr_field = alt.X(
                str(x_attr.attribute),
                type=x_attr.data_type,
                axis=alt.Axis(labelOverlap=True, title=x_attr_abv),
            )
            x_attr_field_code = f"alt.X('{x_attr.attribute}', type= '{x_attr.data_type}', axis=alt.Axis(labelOverlap=True, title='{x_attr_abv}'))"
            y_attr_field = alt.Y(
                str(y_attr.attribute),
                type=y_attr.data_type,
                title=agg_title,
                axis=alt.Axis(title=agg_title),
            )
            y_attr_field_code = f"alt.Y('{y_attr.attribute}', type= '{y_attr.data_type}', title='{agg_title}', axis=alt.Axis(title='{agg_title}'))"
            if x_attr.sort == "ascending":
                x_attr_field.sort = "-y"
                x_attr_field_code = f"alt.X('{x_attr.attribute}', type= '{x_attr.data_type}', axis=alt.Axis(labelOverlap=True, title='{x_attr_abv}'),sort='-y')"
        k = 10
        self._topkcode = ""
        n_bars = len(self.data.iloc[:, 0].unique())
        plotting_scale = lux.config.plotting_scale

        if n_bars > k:  # Truncating to only top k
            remaining_bars = n_bars - k
            self.data = self.data.nlargest(k, columns=measure_attr)
            self.data = AltairChart.sanitize_dataframe(self.data)
            self.text = alt.Chart(self.data).mark_text(
                x=155 * plotting_scale,
                y=142 * plotting_scale,
                align="right",
                color="#ff8e04",
                fontSize=11,
                text=f"+ {remaining_bars} more ...",
            )

            self._topkcode = f"""text = alt.Chart(visData).mark_text(
			x={155 * plotting_scale}, 
			y={142 * plotting_scale},
			align="right",
			color = "#ff8e04",
			fontSize = 11,
			text=f"+ {remaining_bars} more ..."
		)
		chart = chart + text\n"""
        self.data = AltairChart.sanitize_dataframe(self.data)
        chart = alt.Chart(self.data).mark_bar().encode(y=y_attr_field,
                                                       x=x_attr_field)

        # TODO: tooltip messes up the count() bar charts
        # Can not do interactive whenever you have default count measure otherwise output strange error (Javascript Error: Cannot read property 'length' of undefined)
        # chart = chart.interactive() # If you want to enable Zooming and Panning

        self.code += "import altair as alt\n"
        # self.code += f"visData = pd.DataFrame({str(self.data.to_dict(orient='records'))})\n"
        self.code += f"visData = pd.DataFrame({str(self.data.to_dict())})\n"
        self.code += f"""
		chart = alt.Chart(visData).mark_bar().encode(
		    y = {y_attr_field_code},
		    x = {x_attr_field_code},
		)\n"""
        return chart
Beispiel #5
0
    def initialize_chart(self):
        self.tooltip = False
        x_attr = self.vis.get_attr_by_channel("x")[0]
        y_attr = self.vis.get_attr_by_channel("y")[0]

        # Deal with overlong string axes labels
        x_attr_abv = str(x_attr.attribute)
        y_attr_abv = str(y_attr.attribute)
        label_len = lux.config.label_len
        prefix_len = prefix_len = math.ceil(3.0 * label_len / 5.0)
        suffix_len = label_len - prefix_len
        if len(x_attr_abv) > label_len:
            x_attr_abv = x_attr.attribute[:prefix_len] + "..." + x_attr.attribute[-suffix_len:]
        if len(y_attr_abv) > label_len:
            y_attr_abv = y_attr.attribute[:prefix_len] + "..." + y_attr.attribute[-suffix_len:]

        if x_attr.data_model == "measure":
            agg_title = get_agg_title(x_attr)
            measure_attr = x_attr.attribute
            bar_attr = y_attr.attribute
        else:
            agg_title = get_agg_title(y_attr)
            measure_attr = y_attr.attribute
            bar_attr = x_attr.attribute

        k = lux.config.number_of_bars
        n_bars = len(self.data.iloc[:, 0].unique())
        if n_bars > k:  # Truncating to only top k
            remaining_bars = n_bars - k
            self.data = self.data.nlargest(k, measure_attr)
            self.ax.text(
                0.95,
                0.01,
                f"+ {remaining_bars} more ...",
                verticalalignment="bottom",
                horizontalalignment="right",
                transform=self.ax.transAxes,
                fontsize=11,
                fontweight="bold",
                color="#ff8e04",
            )

        df = self.data
        bar = df[bar_attr].apply(lambda x: str(x))
        bars = list(bar)
        measurements = list(df[measure_attr])

        plot_code = ""

        color_attr = self.vis.get_attr_by_channel("color")
        if len(color_attr) == 1:
            self.fig, self.ax = matplotlib_setup(6, 4)
            color_attr_name = color_attr[0].attribute
            colors = df[color_attr_name].values
            unique = list(set(colors))
            d_x = {}
            d_y = {}
            for i in unique:
                d_x[i] = []
                d_y[i] = []
            for i in range(len(colors)):
                d_x[colors[i]].append(bars[i])
                d_y[colors[i]].append(measurements[i])
            for i in range(len(unique)):
                xval = d_x[unique[i]]
                yval = d_y[unique[i]]
                l = unique[i]
                self.ax.barh(xval, yval, label=l)
                plot_code += f"ax.barh({xval},{yval}, label='{l}')\n"
            self.ax.legend(
                title=color_attr_name, bbox_to_anchor=(1.05, 1), loc="upper left", ncol=1, frameon=False
            )
            plot_code += f"""ax.legend(title='{color_attr_name}', 
            bbox_to_anchor=(1.05, 1), 
            loc='upper left', 
            ncol=1, 
            frameon=False)\n"""
        else:
            self.ax.barh(bar, df[measure_attr], align="center")
            plot_code += f"ax.barh({bar}, {df[measure_attr]}, align='center')\n"

        y_ticks_abbev = df[bar_attr].apply(lambda x: str(x)[:10] + "..." if len(str(x)) > 10 else str(x))
        self.ax.set_yticks(bars)
        self.ax.set_yticklabels(y_ticks_abbev)

        self.ax.set_xlabel(x_attr_abv)
        self.ax.set_ylabel(y_attr_abv)
        plt.gca().invert_yaxis()

        self.code += "import numpy as np\n"
        self.code += "from math import nan\n"
        self.code += f"df = pd.DataFrame({str(self.data.to_dict())})\n"
        self.code += f"fig, ax = plt.subplots()\n"
        self.code += f"bars = df['{bar_attr}']\n"
        self.code += f"measurements = df['{measure_attr}']\n"

        self.code += plot_code

        self.code += f"ax.set_xlabel('{x_attr_abv}')\n"
        self.code += f"ax.set_ylabel('{y_attr_abv}')\n"
Beispiel #6
0
    def initialize_chart(self):
        self.tooltip = False
        x_attr = self.vis.get_attr_by_channel("x")[0]
        y_attr = self.vis.get_attr_by_channel("y")[0]

        if x_attr.data_model == "measure":
            agg_title = get_agg_title(x_attr)
            measure_attr = x_attr.attribute
            bar_attr = y_attr.attribute
            y_attr_field = alt.Y(
                y_attr.attribute,
                type=y_attr.data_type,
                axis=alt.Axis(labelOverlap=True),
            )
            x_attr_field = alt.X(x_attr.attribute,
                                 type=x_attr.data_type,
                                 title=agg_title)
            y_attr_field_code = f"alt.Y('{y_attr.attribute}', type= '{y_attr.data_type}', axis=alt.Axis(labelOverlap=True))"
            x_attr_field_code = f"alt.X('{x_attr.attribute}', type= '{x_attr.data_type}', title='{agg_title}')"

            if y_attr.sort == "ascending":
                y_attr_field.sort = "-x"
                y_attr_field_code = f"alt.Y('{y_attr.attribute}', type= '{y_attr.data_type}', axis=alt.Axis(labelOverlap=True), sort ='-x')"
        else:
            agg_title = get_agg_title(y_attr)
            measure_attr = y_attr.attribute
            bar_attr = x_attr.attribute
            x_attr_field = alt.X(
                x_attr.attribute,
                type=x_attr.data_type,
                axis=alt.Axis(labelOverlap=True),
            )
            y_attr_field = alt.Y(y_attr.attribute,
                                 type=y_attr.data_type,
                                 title=agg_title)
            x_attr_field_code = f"alt.X('{x_attr.attribute}', type= '{x_attr.data_type}', axis=alt.Axis(labelOverlap=True))"
            y_attr_field_code = f"alt.Y('{y_attr.attribute}', type= '{y_attr.data_type}', title='{agg_title}')"
            if x_attr.sort == "ascending":
                x_attr_field.sort = "-y"
                x_attr_field_code = f"alt.X('{x_attr.attribute}', type= '{x_attr.data_type}', axis=alt.Axis(labelOverlap=True),sort='-y')"
        k = 10
        self._topkcode = ""
        n_bars = len(self.data[bar_attr].unique())
        if n_bars > k:  # Truncating to only top k
            remaining_bars = n_bars - k
            self.data = self.data.nlargest(k, measure_attr)
            self.text = alt.Chart(self.data).mark_text(
                x=155,
                y=142,
                align="right",
                color="#ff8e04",
                fontSize=11,
                text=f"+ {remaining_bars} more ...",
            )

            self._topkcode = f"""text = alt.Chart(visData).mark_text(
			x=155, 
			y=142,
			align="right",
			color = "#ff8e04",
			fontSize = 11,
			text=f"+ {remaining_bars} more ..."
		)
		chart = chart + text\n"""

        chart = alt.Chart(self.data).mark_bar().encode(y=y_attr_field,
                                                       x=x_attr_field)
        # TODO: tooltip messes up the count() bar charts
        # Can not do interactive whenever you have default count measure otherwise output strange error (Javascript Error: Cannot read property 'length' of undefined)
        # chart = chart.interactive() # If you want to enable Zooming and Panning

        self.code += "import altair as alt\n"
        # self.code += f"visData = pd.DataFrame({str(self.data.to_dict(orient='records'))})\n"
        self.code += f"visData = pd.DataFrame({str(self.data.to_dict())})\n"
        self.code += f"""
		chart = alt.Chart(visData).mark_bar().encode(
		    y = {y_attr_field_code},
		    x = {x_attr_field_code},
		)\n"""
        return chart
Beispiel #7
0
    def initialize_chart(self):
        self.tooltip = False  # tooltip looks weird for line chart
        x_attr = self.vis.get_attr_by_channel("x")[0]
        y_attr = self.vis.get_attr_by_channel("y")[0]

        x_attr_abv = x_attr.attribute
        y_attr_abv = y_attr.attribute

        if len(x_attr.attribute) > 25:
            x_attr_abv = x_attr.attribute[:15] + "..." + x_attr.attribute[-10:]
        if len(y_attr.attribute) > 25:
            y_attr_abv = y_attr.attribute[:15] + "..." + y_attr.attribute[-10:]

        self.data = self.data.dropna(
            subset=[x_attr.attribute, y_attr.attribute])

        df = pd.DataFrame(self.data)

        x_pts = df[x_attr.attribute]
        y_pts = df[y_attr.attribute]

        plot_code = ""

        color_attr = self.vis.get_attr_by_channel("color")
        if len(color_attr) == 1:
            self.fig, self.ax = matplotlib_setup(6, 4)
            color_attr_name = color_attr[0].attribute
            color_attr_type = color_attr[0].data_type
            colors = df[color_attr_name].values
            unique = list(set(colors))
            d_x = {}
            d_y = {}
            for i in unique:
                d_x[i] = []
                d_y[i] = []
            for i in range(len(colors)):
                d_x[colors[i]].append(x_pts[i])
                d_y[colors[i]].append(y_pts[i])
            for i in range(len(unique)):
                self.ax.plot(d_x[unique[i]], d_y[unique[i]], label=unique[i])
                plot_code += f"""ax.plot(
                        {d_x}[{unique}[{i}]], 
                        {d_y}[{unique}[{i}]], 
                        label={unique}[{i}])\n"""
            self.ax.legend(title=color_attr_name,
                           bbox_to_anchor=(1.05, 1),
                           loc="upper left",
                           ncol=1,
                           frameon=False)
            plot_code += f"""ax.legend(
                title='{color_attr_name}', 
                bbox_to_anchor=(1.05, 1), 
                loc='upper left', 
                ncol=1, 
                frameon=False,)\n"""
        else:
            self.ax.plot(x_pts, y_pts)
            plot_code += f"ax.plot(x_pts, y_pts)\n"

        x_label = ""
        y_label = ""
        if y_attr.data_model == "measure":
            agg_title = get_agg_title(y_attr)
            self.ax.set_xlabel(x_attr_abv)
            self.ax.set_ylabel(agg_title)
            x_label = x_attr_abv
            y_label = agg_title
        else:
            agg_title = get_agg_title(x_attr)
            self.ax.set_xlabel(agg_title)
            self.ax.set_ylabel(y_attr_abv)
            x_label = agg_title
            y_label = y_attr_abv

        self.code += "import numpy as np\n"
        self.code += "from math import nan\n"

        self.code += f"fig, ax = plt.subplots()\n"
        self.code += f"x_pts = df['{x_attr.attribute}']\n"
        self.code += f"y_pts = df['{y_attr.attribute}']\n"

        self.code += plot_code

        self.code += f"ax.set_xlabel('{x_label}')\n"
        self.code += f"ax.set_ylabel('{y_label}')\n"
Beispiel #8
0
    def initialize_chart(self):
        self.tooltip = False
        x_attr = self.vis.get_attr_by_channel("x")[0]
        y_attr = self.vis.get_attr_by_channel("y")[0]

        x_attr_abv = x_attr.attribute
        y_attr_abv = y_attr.attribute

        if len(x_attr.attribute) > 25:
            x_attr_abv = x_attr.attribute[:15] + "..." + x_attr.attribute[-10:]
        if len(y_attr.attribute) > 25:
            y_attr_abv = y_attr.attribute[:15] + "..." + y_attr.attribute[-10:]

        if x_attr.data_model == "measure":
            agg_title = get_agg_title(x_attr)
            measure_attr = x_attr.attribute
            bar_attr = y_attr.attribute
        else:
            agg_title = get_agg_title(y_attr)
            measure_attr = y_attr.attribute
            bar_attr = x_attr.attribute

        k = 10
        self._topkcode = ""
        n_bars = len(self.data.iloc[:, 0].unique())
        if n_bars > k:  # Truncating to only top k
            remaining_bars = n_bars - k
            self.data = self.data.nlargest(k, measure_attr)
            self.ax.text(
                0.95,
                0.01,
                f"+ {remaining_bars} more ...",
                verticalalignment="bottom",
                horizontalalignment="right",
                transform=self.ax.transAxes,
                fontsize=11,
                fontweight="bold",
                color="#ff8e04",
            )

            self._topkcode = f"""text = alt.Chart(visData).mark_text(
			x=155, 
			y=142,
			align="right",
			color = "#ff8e04",
			fontSize = 11,
			text=f"+ {remaining_bars} more ..."
		)
		chart = chart + text\n"""

        df = pd.DataFrame(self.data)

        bars = df[bar_attr].apply(lambda x: str(x))
        measurements = df[measure_attr]

        plot_code = ""

        color_attr = self.vis.get_attr_by_channel("color")
        if len(color_attr) == 1:
            self.fig, self.ax = matplotlib_setup(6, 4)
            color_attr_name = color_attr[0].attribute
            color_attr_type = color_attr[0].data_type
            colors = df[color_attr_name].values
            unique = list(set(colors))
            d_x = {}
            d_y = {}
            for i in unique:
                d_x[i] = []
                d_y[i] = []
            for i in range(len(colors)):
                d_x[colors[i]].append(bars[i])
                d_y[colors[i]].append(measurements[i])
            for i in range(len(unique)):
                self.ax.barh(d_x[unique[i]], d_y[unique[i]], label=unique[i])
                plot_code += (
                    f"ax.barh({d_x}[{unique}[{i}]], {d_y}[{unique}[{i}]], label={unique}[{i}])\n"
                )
            self.ax.legend(title=color_attr_name,
                           bbox_to_anchor=(1.05, 1),
                           loc="upper left",
                           ncol=1,
                           frameon=False)
            plot_code += f"""ax.legend(
                title='{color_attr_name}', 
                bbox_to_anchor=(1.05, 1), 
                loc='upper left', 
                ncol=1, 
                frameon=False,)\n"""
        else:
            self.ax.barh(bars, measurements, align="center")
            plot_code += f"ax.barh(bars, measurements, align='center')\n"

        y_ticks_abbev = df[bar_attr].apply(lambda x: str(x)[:10] + "..."
                                           if len(str(x)) > 10 else str(x))
        self.ax.set_yticks(bars)
        self.ax.set_yticklabels(y_ticks_abbev)

        self.ax.set_xlabel(x_attr_abv)
        self.ax.set_ylabel(y_attr_abv)
        plt.gca().invert_yaxis()

        self.code += "import numpy as np\n"
        self.code += "from math import nan\n"

        self.code += f"fig, ax = plt.subplots()\n"
        self.code += f"bars = df['{bar_attr}']\n"
        self.code += f"measurements = df['{measure_attr}']\n"

        self.code += plot_code

        self.code += f"ax.set_xlabel('{x_attr_abv}')\n"
        self.code += f"ax.set_ylabel('{y_attr_abv}')\n"