Skip to content

chart module

Module for creating charts from Earth Engine data.

BarChart (BaseChartClass)

Create Bar Chart. All histogram/bar charts can use this object.

Source code in geemap/chart.py
class BarChart(BaseChartClass):
    """Create Bar Chart. All histogram/bar charts can use this object."""

    def __init__(
        self,
        features: Union[ee.FeatureCollection, pd.DataFrame],
        default_labels: List[str],
        name: str,
        type: str = "grouped",
        **kwargs: Any,
    ):
        """
        Initializes the BarChart with the given features, labels, name, and type.

        Args:
            features (ee.FeatureCollection | pd.DataFrame): The features to plot.
            default_labels (List[str]): The default labels for the chart.
            name (str): The name of the chart.
            type (str, optional): The type of bar chart ('grouped' or 'stacked').
                Defaults to 'grouped'.
            **kwargs: Additional keyword arguments to set as attributes.
        """
        super().__init__(features, default_labels, name, **kwargs)
        self.type: str = type

    def generate_tooltip(self) -> None:
        """
        Generates a tooltip for the bar chart.
        """
        if (self.x_label is not None) and (self.y_label is not None):
            self.bar_chart.tooltip = Tooltip(
                fields=["x", "y"], labels=[self.x_label, self.y_label]
            )
        else:
            self.bar_chart.tooltip = Tooltip(fields=["x", "y"])

    def get_ylim(self) -> Tuple[float, float]:
        """
        Gets the y-axis limits for the bar chart.

        Returns:
            Tuple[float, float]: The minimum and maximum y-axis limits.
        """
        if self.ylim:
            ylim_min, ylim_max = self.ylim[0], self.ylim[1]
        else:
            if self.name in ["feature.byFeature", "feature.byProperty"]:
                ylim_min = np.min(self.y_data)
                ylim_max = np.max(self.y_data)   0.2 * (
                    np.max(self.y_data) - np.min(self.y_data)
                )
            if self.name in ["feature.groups"]:
                ylim_min = np.min(self.df[self.yProperty])
                ylim_max = np.max(self.df[self.yProperty])
                ylim_max = ylim_max   0.2 * (ylim_max - ylim_min)
        return (ylim_min, ylim_max)

    def plot_chart(self) -> None:
        """
        Plots the bar chart.
        """
        fig = plt.figure(
            title=self.title,
            legend_location=self.legend_location,
        )

        self.bar_chart = plt.bar(
            self.x_data,
            self.y_data,
            labels=self.labels,
            display_legend=self.display_legend,
        )

        self.generate_tooltip()
        plt.ylim(*self.get_ylim())
        if self.x_label:
            plt.xlabel(self.x_label)
        if self.y_label:
            plt.ylabel(self.y_label)

        if self.width:
            fig.layout.width = self.width
        if self.height:
            fig.layout.height = self.height

        self.bar_chart.colors = self.colors
        self.bar_chart.type = self.type

        plt.show()

__init__(self, features, default_labels, name, type='grouped', **kwargs) special

Initializes the BarChart with the given features, labels, name, and type.

Parameters:

Name Type Description Default
features ee.FeatureCollection | pd.DataFrame

The features to plot.

required
default_labels List[str]

The default labels for the chart.

required
name str

The name of the chart.

required
type str

The type of bar chart ('grouped' or 'stacked'). Defaults to 'grouped'.

'grouped'
**kwargs Any

Additional keyword arguments to set as attributes.

{}
Source code in geemap/chart.py
def __init__(
    self,
    features: Union[ee.FeatureCollection, pd.DataFrame],
    default_labels: List[str],
    name: str,
    type: str = "grouped",
    **kwargs: Any,
):
    """
    Initializes the BarChart with the given features, labels, name, and type.

    Args:
        features (ee.FeatureCollection | pd.DataFrame): The features to plot.
        default_labels (List[str]): The default labels for the chart.
        name (str): The name of the chart.
        type (str, optional): The type of bar chart ('grouped' or 'stacked').
            Defaults to 'grouped'.
        **kwargs: Additional keyword arguments to set as attributes.
    """
    super().__init__(features, default_labels, name, **kwargs)
    self.type: str = type

generate_tooltip(self)

Generates a tooltip for the bar chart.

Source code in geemap/chart.py
def generate_tooltip(self) -> None:
    """
    Generates a tooltip for the bar chart.
    """
    if (self.x_label is not None) and (self.y_label is not None):
        self.bar_chart.tooltip = Tooltip(
            fields=["x", "y"], labels=[self.x_label, self.y_label]
        )
    else:
        self.bar_chart.tooltip = Tooltip(fields=["x", "y"])

get_ylim(self)

Gets the y-axis limits for the bar chart.

Returns:

Type Description
Tuple[float, float]

The minimum and maximum y-axis limits.

Source code in geemap/chart.py
def get_ylim(self) -> Tuple[float, float]:
    """
    Gets the y-axis limits for the bar chart.

    Returns:
        Tuple[float, float]: The minimum and maximum y-axis limits.
    """
    if self.ylim:
        ylim_min, ylim_max = self.ylim[0], self.ylim[1]
    else:
        if self.name in ["feature.byFeature", "feature.byProperty"]:
            ylim_min = np.min(self.y_data)
            ylim_max = np.max(self.y_data)   0.2 * (
                np.max(self.y_data) - np.min(self.y_data)
            )
        if self.name in ["feature.groups"]:
            ylim_min = np.min(self.df[self.yProperty])
            ylim_max = np.max(self.df[self.yProperty])
            ylim_max = ylim_max   0.2 * (ylim_max - ylim_min)
    return (ylim_min, ylim_max)

plot_chart(self)

Plots the bar chart.

Source code in geemap/chart.py
def plot_chart(self) -> None:
    """
    Plots the bar chart.
    """
    fig = plt.figure(
        title=self.title,
        legend_location=self.legend_location,
    )

    self.bar_chart = plt.bar(
        self.x_data,
        self.y_data,
        labels=self.labels,
        display_legend=self.display_legend,
    )

    self.generate_tooltip()
    plt.ylim(*self.get_ylim())
    if self.x_label:
        plt.xlabel(self.x_label)
    if self.y_label:
        plt.ylabel(self.y_label)

    if self.width:
        fig.layout.width = self.width
    if self.height:
        fig.layout.height = self.height

    self.bar_chart.colors = self.colors
    self.bar_chart.type = self.type

    plt.show()

BaseChartClass

This should include everything a chart module requires to plot figures.

Source code in geemap/chart.py
class BaseChartClass:
    """This should include everything a chart module requires to plot figures."""

    def __init__(
        self,
        features: Union[ee.FeatureCollection, pd.DataFrame],
        default_labels: List[str],
        name: str,
        **kwargs: Any,
    ):
        """
        Initializes the BaseChartClass with the given features, labels, and name.

        Args:
            features (ee.FeatureCollection | pd.DataFrame): The features to plot.
            default_labels (List[str]): The default labels for the chart.
            name (str): The name of the chart.
            **kwargs: Additional keyword arguments to set as attributes.
        """
        self.ylim = None
        self.xlim = None
        self.title = ""
        self.legend_location = "top-left"
        self.layout_width = None
        self.layout_height = None
        self.display_legend = True
        self.x_label = None
        self.y_label = None
        self.labels = default_labels
        self.width = None
        self.height = None
        self.name = name

        if isinstance(self.labels, list) and (len(self.labels) > 1):
            self.colors = [
                "#604791",
                "#1d6b99",
                "#39a8a7",
                "#0f8755",
                "#76b349",
                "#f0af07",
                "#e37d05",
                "#cf513e",
                "#96356f",
                "#724173",
                "#9c4f97",
                "#696969",
            ]
        else:
            self.colors = "black"

        if isinstance(features, ee.FeatureCollection):
            self.df = ee_to_df(features)
        elif isinstance(features, pd.DataFrame):
            self.df = features

        for key, value in kwargs.items():
            setattr(self, key, value)

    @classmethod
    def get_data(cls) -> None:
        """
        Placeholder method to get data for the chart.
        """
        pass

    @classmethod
    def plot_chart(cls) -> None:
        """
        Placeholder method to plot the chart.
        """
        pass

    def __repr__(self) -> str:
        """
        Returns the string representation of the chart.

        Returns:
            str: The name of the chart.
        """
        return self.name

__init__(self, features, default_labels, name, **kwargs) special

Initializes the BaseChartClass with the given features, labels, and name.

Parameters:

Name Type Description Default
features ee.FeatureCollection | pd.DataFrame

The features to plot.

required
default_labels List[str]

The default labels for the chart.

required
name str

The name of the chart.

required
**kwargs Any

Additional keyword arguments to set as attributes.

{}
Source code in geemap/chart.py
def __init__(
    self,
    features: Union[ee.FeatureCollection, pd.DataFrame],
    default_labels: List[str],
    name: str,
    **kwargs: Any,
):
    """
    Initializes the BaseChartClass with the given features, labels, and name.

    Args:
        features (ee.FeatureCollection | pd.DataFrame): The features to plot.
        default_labels (List[str]): The default labels for the chart.
        name (str): The name of the chart.
        **kwargs: Additional keyword arguments to set as attributes.
    """
    self.ylim = None
    self.xlim = None
    self.title = ""
    self.legend_location = "top-left"
    self.layout_width = None
    self.layout_height = None
    self.display_legend = True
    self.x_label = None
    self.y_label = None
    self.labels = default_labels
    self.width = None
    self.height = None
    self.name = name

    if isinstance(self.labels, list) and (len(self.labels) > 1):
        self.colors = [
            "#604791",
            "#1d6b99",
            "#39a8a7",
            "#0f8755",
            "#76b349",
            "#f0af07",
            "#e37d05",
            "#cf513e",
            "#96356f",
            "#724173",
            "#9c4f97",
            "#696969",
        ]
    else:
        self.colors = "black"

    if isinstance(features, ee.FeatureCollection):
        self.df = ee_to_df(features)
    elif isinstance(features, pd.DataFrame):
        self.df = features

    for key, value in kwargs.items():
        setattr(self, key, value)

__repr__(self) special

Returns the string representation of the chart.

Returns:

Type Description
str

The name of the chart.

Source code in geemap/chart.py
def __repr__(self) -> str:
    """
    Returns the string representation of the chart.

    Returns:
        str: The name of the chart.
    """
    return self.name

get_data() classmethod

Placeholder method to get data for the chart.

Source code in geemap/chart.py
@classmethod
def get_data(cls) -> None:
    """
    Placeholder method to get data for the chart.
    """
    pass

plot_chart() classmethod

Placeholder method to plot the chart.

Source code in geemap/chart.py
@classmethod
def plot_chart(cls) -> None:
    """
    Placeholder method to plot the chart.
    """
    pass

Chart

A class to create and display various types of charts from a data table.

Attributes:

Name Type Description
data_table pd.DataFrame

The data to be displayed in the charts.

chart_type str

The type of chart to create. Supported types are 'ScatterChart', 'LineChart', 'ColumnChart', 'BarChart', 'PieChart', 'AreaChart', and 'Table'.

chart

The bqplot Figure object for the chart.

Source code in geemap/chart.py
class Chart:
    """
    A class to create and display various types of charts from a data table.

    Attributes:
        data_table (pd.DataFrame): The data to be displayed in the charts.
        chart_type (str): The type of chart to create. Supported types are
            'ScatterChart', 'LineChart', 'ColumnChart', 'BarChart', 'PieChart',
            'AreaChart', and 'Table'.
        chart: The bqplot Figure object for the chart.
    """

    def __init__(
        self,
        data_table: Union[Dict[str, List[Any]], pd.DataFrame],
        chart_type: str = "LineChart",
        x_cols: Optional[List[str]] = None,
        y_cols: Optional[List[str]] = None,
        colors: Optional[List[str]] = None,
        title: Optional[str] = None,
        x_label: Optional[str] = None,
        y_label: Optional[str] = None,
        **kwargs: Any,
    ) -> None:
        """
        Initializes the Chart with data.

        Args:
            data_table (Union[Dict[str, List[Any]], pd.DataFrame]): A 2-D array of data.
                If it's a dictionary, it will be converted to a DataFrame.
            chart_type (str): The type of chart to create. Supported types are
                'ScatterChart', 'LineChart', 'ColumnChart', 'BarChart',
                'PieChart', 'AreaChart', and 'Table'.
            x_cols (Optional[List[str]]): The columns to use for the x-axis.
                Defaults to the first column.
            y_cols (Optional[List[str]]): The columns to use for the y-axis.
                Defaults to the second column.
            colors (Optional[List[str]]): The colors to use for the chart.
                Defaults to a predefined list of colors.
            title (Optional[str]): The title of the chart. Defaults to the
                chart type.
            x_label (Optional[str]): The label for the x-axis. Defaults to an
                empty string.
            y_label (Optional[str]): The label for the y-axis. Defaults to an
                empty string.
            **kwargs: Additional keyword arguments to pass to the bqplot Figure
                or mark objects. For axes_options, see
                https://bqplot.github.io/bqplot/api/axes
        """
        self.data_table = DataTable(data_table)
        self.chart_type = chart_type
        self.chart = None
        self.title = title
        self.x_label = x_label
        self.y_label = y_label
        self.x_cols = x_cols
        self.y_cols = y_cols
        self.colors = colors
        self.xlim = kwargs.pop("xlim", None)
        self.ylim = kwargs.pop("ylim", None)

        if title is not None:
            kwargs["title"] = title
        self.figure = plt.figure(**kwargs)

        if chart_type is not None:
            self.set_chart_type(chart_type, **kwargs)

    def display(self) -> None:
        """
        Display the chart without toolbar.
        """
        self._set_plt_options()
        display(self.figure)

    def save_png(self, filepath: str = "chart.png", scale: float = 1.0) -> None:
        """
        Save the chart as a PNG image.

        Args:
            filepath (str): The path to save the PNG image. Defaults to 'chart.png'.
            scale (float): The scale factor for the image. Defaults to 1.0.
        """
        self.figure.save_png(filepath, scale=scale)

    def _ipython_display_(self) -> None:
        """
        Display the chart with toolbar.
        """
        self._set_plt_options()
        plt.show()

    def _set_plt_options(self) -> None:
        """
        Set the title and labels for the chart.
        """
        if self.title is not None:
            self.figure.title = self.title
        if self.x_label is not None:
            plt.xlabel(self.x_label)
        if self.y_label is not None:
            plt.ylabel(self.y_label)
        if self.xlim is not None:
            plt.xlim(self.xlim[0], self.xlim[1])
        if self.ylim is not None:
            plt.ylim(self.ylim[0], self.ylim[1])

    def set_chart_type(
        self,
        chart_type: str,
        clear: bool = True,
        **kwargs: Any,
    ) -> None:
        """
        Sets the chart type and other chart properties.

        Args:
            chart_type (str): The type of chart to create. Supported types are
                'ScatterChart', 'LineChart', 'ColumnChart', 'BarChart',
                'PieChart', 'AreaChart', and 'Table'.
            clear (bool): Whether to clear the current chart before setting a new one.
                Defaults to True.
            **kwargs: Additional keyword arguments to pass to the bqplot Figure
                or mark objects.

        Returns:
            Chart: The Chart instance with the chart set.
        """
        if clear:
            plt.clear()
        self.chart_type = chart_type
        x_cols = self.x_cols
        y_cols = self.y_cols
        colors = self.colors

        if x_cols is None:
            x_cols = [self.data_table.columns[0]]
        if y_cols is None:
            y_cols = [self.data_table.columns[1]]

        if isinstance(x_cols, str):
            x_cols = [x_cols]

        if isinstance(y_cols, str):
            y_cols = [y_cols]

        if len(x_cols) == 1 and len(y_cols) > 1:
            x_cols = x_cols * len(y_cols)

        if "axes_options" not in kwargs:
            kwargs["axes_options"] = {
                "x": {"label_offset": "30px"},
                "y": {"label_offset": "40px"},
            }

        if chart_type == "PieChart":
            if colors is None:
                colors = [
                    "#1f77b4",
                    "#ff7f0e",
                    "#2ca02c",
                    "#d62728",
                    "#9467bd",
                    "#8c564b",
                    "#e377c2",
                    "#7f7f7f",
                    "#bcbd22",
                    "#17becf",
                ]  # Default pie chart colors
        else:
            if colors is None:
                colors = [
                    "blue",
                    "orange",
                    "green",
                    "red",
                    "purple",
                    "brown",
                ]  # Default colors

        if chart_type == "IntervalChart":

            x = self.data_table[x_cols[0]]
            y = [self.data_table[y_col] for y_col in y_cols]
            if "fill" not in kwargs:
                kwargs["fill"] = "between"

            self.chart = plt.plot(
                x,
                y,
                colors=colors,
                **kwargs,
            )
        else:
            for i, (x_col, y_col) in enumerate(zip(x_cols, y_cols)):
                color = colors[i % len(colors)]
                if "display_legend" not in kwargs and len(y_cols) > 1:
                    kwargs["display_legend"] = True
                    kwargs["labels"] = [y_col]
                else:
                    kwargs["labels"] = [y_col]

                x = self.data_table[x_col]
                y = self.data_table[y_col]

                if isinstance(x, pd.Series) and (
                    not pd.api.types.is_datetime64_any_dtype(x)
                ):
                    x = x.tolist()
                if isinstance(y, pd.Series) and (
                    not pd.api.types.is_datetime64_any_dtype(y)
                ):
                    y = y.tolist()

                if chart_type == "ScatterChart":
                    self.chart = plt.scatter(
                        x,
                        y,
                        colors=[color],
                        **kwargs,
                    )
                elif chart_type == "LineChart":
                    self.chart = plt.plot(
                        x,
                        y,
                        colors=[color],
                        **kwargs,
                    )
                elif chart_type == "AreaChart":
                    if "fill" not in kwargs:
                        kwargs["fill"] = "bottom"
                    self.chart = plt.plot(
                        x,
                        y,
                        colors=[color],
                        **kwargs,
                    )
                elif chart_type == "ColumnChart":
                    self.chart = plt.bar(
                        x,
                        y,
                        colors=[color],
                        **kwargs,
                    )
                elif chart_type == "BarChart":
                    if "orientation" not in kwargs:
                        kwargs["orientation"] = "horizontal"
                    self.chart = plt.bar(
                        x,
                        y,
                        colors=[color],
                        **kwargs,
                    )
                elif chart_type == "AreaChart":
                    if "fill" not in kwargs:
                        kwargs["fill"] = "bottom"
                    self.chart = plt.plot(
                        x,
                        y,
                        colors=[color],
                        **kwargs,
                    )
                elif chart_type == "PieChart":
                    kwargs.pop("labels", None)
                    self.chart = plt.pie(
                        sizes=y,
                        labels=x,
                        colors=colors[: len(x)],
                        **kwargs,
                    )
                elif chart_type == "Table":
                    output = widgets.Output(**kwargs)
                    with output:
                        display(self.data_table)
                    output.layout = widgets.Layout(width="50%")
                    display(output)
                else:
                    self.chart = plt.plot(
                        x,
                        y,
                        colors=[color],
                        **kwargs,
                    )

        self._set_plt_options()

    def get_chart_type(self) -> Optional[str]:
        """
        Get the current chart type.

        Returns:
            Optional[str]: The current chart type, or None if no chart type is set.
        """
        return self.chart_type

    def get_data_table(self) -> DataTable:
        """
        Get the DataTable used by the chart.

        Returns:
            DataTable: The DataTable instance containing the chart data.
        """
        return self.data_table

    def set_data_table(self, data: Union[Dict[str, List[Any]], pd.DataFrame]) -> None:
        """
        Set a new DataTable for the chart.

        Args:
            data (Union[Dict[str, List[Any]], pd.DataFrame]): The new data to be
            used for the chart.
        """
        self.data_table = DataTable(data)

    def set_options(self, **options: Any) -> None:
        """
        Set additional options for the chart.

        Args:
            **options: Additional options to set for the chart.
        """
        for key, value in options.items():
            setattr(self.figure, key, value)

__init__(self, data_table, chart_type='LineChart', x_cols=None, y_cols=None, colors=None, title=None, x_label=None, y_label=None, **kwargs) special

Initializes the Chart with data.

Parameters:

Name Type Description Default
data_table Union[Dict[str, List[Any]], pd.DataFrame]

A 2-D array of data. If it's a dictionary, it will be converted to a DataFrame.

required
chart_type str

The type of chart to create. Supported types are 'ScatterChart', 'LineChart', 'ColumnChart', 'BarChart', 'PieChart', 'AreaChart', and 'Table'.

'LineChart'
x_cols Optional[List[str]]

The columns to use for the x-axis. Defaults to the first column.

None
y_cols Optional[List[str]]

The columns to use for the y-axis. Defaults to the second column.

None
colors Optional[List[str]]

The colors to use for the chart. Defaults to a predefined list of colors.

None
title Optional[str]

The title of the chart. Defaults to the chart type.

None
x_label Optional[str]

The label for the x-axis. Defaults to an empty string.

None
y_label Optional[str]

The label for the y-axis. Defaults to an empty string.

None
**kwargs Any

Additional keyword arguments to pass to the bqplot Figure or mark objects. For axes_options, see https://bqplot.github.io/bqplot/api/axes

{}
Source code in geemap/chart.py
def __init__(
    self,
    data_table: Union[Dict[str, List[Any]], pd.DataFrame],
    chart_type: str = "LineChart",
    x_cols: Optional[List[str]] = None,
    y_cols: Optional[List[str]] = None,
    colors: Optional[List[str]] = None,
    title: Optional[str] = None,
    x_label: Optional[str] = None,
    y_label: Optional[str] = None,
    **kwargs: Any,
) -> None:
    """
    Initializes the Chart with data.

    Args:
        data_table (Union[Dict[str, List[Any]], pd.DataFrame]): A 2-D array of data.
            If it's a dictionary, it will be converted to a DataFrame.
        chart_type (str): The type of chart to create. Supported types are
            'ScatterChart', 'LineChart', 'ColumnChart', 'BarChart',
            'PieChart', 'AreaChart', and 'Table'.
        x_cols (Optional[List[str]]): The columns to use for the x-axis.
            Defaults to the first column.
        y_cols (Optional[List[str]]): The columns to use for the y-axis.
            Defaults to the second column.
        colors (Optional[List[str]]): The colors to use for the chart.
            Defaults to a predefined list of colors.
        title (Optional[str]): The title of the chart. Defaults to the
            chart type.
        x_label (Optional[str]): The label for the x-axis. Defaults to an
            empty string.
        y_label (Optional[str]): The label for the y-axis. Defaults to an
            empty string.
        **kwargs: Additional keyword arguments to pass to the bqplot Figure
            or mark objects. For axes_options, see
            https://bqplot.github.io/bqplot/api/axes
    """
    self.data_table = DataTable(data_table)
    self.chart_type = chart_type
    self.chart = None
    self.title = title
    self.x_label = x_label
    self.y_label = y_label
    self.x_cols = x_cols
    self.y_cols = y_cols
    self.colors = colors
    self.xlim = kwargs.pop("xlim", None)
    self.ylim = kwargs.pop("ylim", None)

    if title is not None:
        kwargs["title"] = title
    self.figure = plt.figure(**kwargs)

    if chart_type is not None:
        self.set_chart_type(chart_type, **kwargs)

display(self)

Display the chart without toolbar.

Source code in geemap/chart.py
def display(self) -> None:
    """
    Display the chart without toolbar.
    """
    self._set_plt_options()
    display(self.figure)

get_chart_type(self)

Get the current chart type.

Returns:

Type Description
Optional[str]

The current chart type, or None if no chart type is set.

Source code in geemap/chart.py
def get_chart_type(self) -> Optional[str]:
    """
    Get the current chart type.

    Returns:
        Optional[str]: The current chart type, or None if no chart type is set.
    """
    return self.chart_type

get_data_table(self)

Get the DataTable used by the chart.

Returns:

Type Description
DataTable

The DataTable instance containing the chart data.

Source code in geemap/chart.py
def get_data_table(self) -> DataTable:
    """
    Get the DataTable used by the chart.

    Returns:
        DataTable: The DataTable instance containing the chart data.
    """
    return self.data_table

save_png(self, filepath='chart.png', scale=1.0)

Save the chart as a PNG image.

Parameters:

Name Type Description Default
filepath str

The path to save the PNG image. Defaults to 'chart.png'.

'chart.png'
scale float

The scale factor for the image. Defaults to 1.0.

1.0
Source code in geemap/chart.py
def save_png(self, filepath: str = "chart.png", scale: float = 1.0) -> None:
    """
    Save the chart as a PNG image.

    Args:
        filepath (str): The path to save the PNG image. Defaults to 'chart.png'.
        scale (float): The scale factor for the image. Defaults to 1.0.
    """
    self.figure.save_png(filepath, scale=scale)

set_chart_type(self, chart_type, clear=True, **kwargs)

Sets the chart type and other chart properties.

Parameters:

Name Type Description Default
chart_type str

The type of chart to create. Supported types are 'ScatterChart', 'LineChart', 'ColumnChart', 'BarChart', 'PieChart', 'AreaChart', and 'Table'.

required
clear bool

Whether to clear the current chart before setting a new one. Defaults to True.

True
**kwargs Any

Additional keyword arguments to pass to the bqplot Figure or mark objects.

{}

Returns:

Type Description
Chart

The Chart instance with the chart set.

Source code in geemap/chart.py
def set_chart_type(
    self,
    chart_type: str,
    clear: bool = True,
    **kwargs: Any,
) -> None:
    """
    Sets the chart type and other chart properties.

    Args:
        chart_type (str): The type of chart to create. Supported types are
            'ScatterChart', 'LineChart', 'ColumnChart', 'BarChart',
            'PieChart', 'AreaChart', and 'Table'.
        clear (bool): Whether to clear the current chart before setting a new one.
            Defaults to True.
        **kwargs: Additional keyword arguments to pass to the bqplot Figure
            or mark objects.

    Returns:
        Chart: The Chart instance with the chart set.
    """
    if clear:
        plt.clear()
    self.chart_type = chart_type
    x_cols = self.x_cols
    y_cols = self.y_cols
    colors = self.colors

    if x_cols is None:
        x_cols = [self.data_table.columns[0]]
    if y_cols is None:
        y_cols = [self.data_table.columns[1]]

    if isinstance(x_cols, str):
        x_cols = [x_cols]

    if isinstance(y_cols, str):
        y_cols = [y_cols]

    if len(x_cols) == 1 and len(y_cols) > 1:
        x_cols = x_cols * len(y_cols)

    if "axes_options" not in kwargs:
        kwargs["axes_options"] = {
            "x": {"label_offset": "30px"},
            "y": {"label_offset": "40px"},
        }

    if chart_type == "PieChart":
        if colors is None:
            colors = [
                "#1f77b4",
                "#ff7f0e",
                "#2ca02c",
                "#d62728",
                "#9467bd",
                "#8c564b",
                "#e377c2",
                "#7f7f7f",
                "#bcbd22",
                "#17becf",
            ]  # Default pie chart colors
    else:
        if colors is None:
            colors = [
                "blue",
                "orange",
                "green",
                "red",
                "purple",
                "brown",
            ]  # Default colors

    if chart_type == "IntervalChart":

        x = self.data_table[x_cols[0]]
        y = [self.data_table[y_col] for y_col in y_cols]
        if "fill" not in kwargs:
            kwargs["fill"] = "between"

        self.chart = plt.plot(
            x,
            y,
            colors=colors,
            **kwargs,
        )
    else:
        for i, (x_col, y_col) in enumerate(zip(x_cols, y_cols)):
            color = colors[i % len(colors)]
            if "display_legend" not in kwargs and len(y_cols) > 1:
                kwargs["display_legend"] = True
                kwargs["labels"] = [y_col]
            else:
                kwargs["labels"] = [y_col]

            x = self.data_table[x_col]
            y = self.data_table[y_col]

            if isinstance(x, pd.Series) and (
                not pd.api.types.is_datetime64_any_dtype(x)
            ):
                x = x.tolist()
            if isinstance(y, pd.Series) and (
                not pd.api.types.is_datetime64_any_dtype(y)
            ):
                y = y.tolist()

            if chart_type == "ScatterChart":
                self.chart = plt.scatter(
                    x,
                    y,
                    colors=[color],
                    **kwargs,
                )
            elif chart_type == "LineChart":
                self.chart = plt.plot(
                    x,
                    y,
                    colors=[color],
                    **kwargs,
                )
            elif chart_type == "AreaChart":
                if "fill" not in kwargs:
                    kwargs["fill"] = "bottom"
                self.chart = plt.plot(
                    x,
                    y,
                    colors=[color],
                    **kwargs,
                )
            elif chart_type == "ColumnChart":
                self.chart = plt.bar(
                    x,
                    y,
                    colors=[color],
                    **kwargs,
                )
            elif chart_type == "BarChart":
                if "orientation" not in kwargs:
                    kwargs["orientation"] = "horizontal"
                self.chart = plt.bar(
                    x,
                    y,
                    colors=[color],
                    **kwargs,
                )
            elif chart_type == "AreaChart":
                if "fill" not in kwargs:
                    kwargs["fill"] = "bottom"
                self.chart = plt.plot(
                    x,
                    y,
                    colors=[color],
                    **kwargs,
                )
            elif chart_type == "PieChart":
                kwargs.pop("labels", None)
                self.chart = plt.pie(
                    sizes=y,
                    labels=x,
                    colors=colors[: len(x)],
                    **kwargs,
                )
            elif chart_type == "Table":
                output = widgets.Output(**kwargs)
                with output:
                    display(self.data_table)
                output.layout = widgets.Layout(width="50%")
                display(output)
            else:
                self.chart = plt.plot(
                    x,
                    y,
                    colors=[color],
                    **kwargs,
                )

    self._set_plt_options()

set_data_table(self, data)

Set a new DataTable for the chart.

Parameters:

Name Type Description Default
data Union[Dict[str, List[Any]], pd.DataFrame]

The new data to be

required
Source code in geemap/chart.py
def set_data_table(self, data: Union[Dict[str, List[Any]], pd.DataFrame]) -> None:
    """
    Set a new DataTable for the chart.

    Args:
        data (Union[Dict[str, List[Any]], pd.DataFrame]): The new data to be
        used for the chart.
    """
    self.data_table = DataTable(data)

set_options(self, **options)

Set additional options for the chart.

Parameters:

Name Type Description Default
**options Any

Additional options to set for the chart.

{}
Source code in geemap/chart.py
def set_options(self, **options: Any) -> None:
    """
    Set additional options for the chart.

    Args:
        **options: Additional options to set for the chart.
    """
    for key, value in options.items():
        setattr(self.figure, key, value)

DataTable (DataFrame)

Source code in geemap/chart.py
class DataTable(pd.DataFrame):

    def __init__(
        self,
        data: Union[Dict[str, List[Any]], pd.DataFrame, None] = None,
        date_column: Optional[str] = None,
        date_format: Optional[str] = None,
        **kwargs: Any,
    ) -> None:
        """
        Initializes the DataTable with data.

        Args:
            data (Union[Dict[str, List[Any]], pd.DataFrame, None]): The input
                data. If it's a dictionary, it will be converted to a DataFrame.
            date_column (Optional[str]): The date column to convert to a DataFrame.
            date_format (Optional[str]): The format of the date column.
            **kwargs: Additional keyword arguments to pass to the pd.DataFrame
                constructor.
        """
        if isinstance(data, ee.FeatureCollection):
            data = ee_to_df(data)
        elif isinstance(data, ee.List):
            data = data.getInfo()
            kwargs["columns"] = data[0]
            data = data[1:]

        super().__init__(data, **kwargs)

        if date_column is not None:
            self[date_column] = pd.to_datetime(
                self[date_column], format=date_format, errors="coerce"
            )

__init__(self, data=None, date_column=None, date_format=None, **kwargs) special

Initializes the DataTable with data.

Parameters:

Name Type Description Default
data Union[Dict[str, List[Any]], pd.DataFrame, None]

The input data. If it's a dictionary, it will be converted to a DataFrame.

None
date_column Optional[str]

The date column to convert to a DataFrame.

None
date_format Optional[str]

The format of the date column.

None
**kwargs Any

Additional keyword arguments to pass to the pd.DataFrame constructor.

{}
Source code in geemap/chart.py
def __init__(
    self,
    data: Union[Dict[str, List[Any]], pd.DataFrame, None] = None,
    date_column: Optional[str] = None,
    date_format: Optional[str] = None,
    **kwargs: Any,
) -> None:
    """
    Initializes the DataTable with data.

    Args:
        data (Union[Dict[str, List[Any]], pd.DataFrame, None]): The input
            data. If it's a dictionary, it will be converted to a DataFrame.
        date_column (Optional[str]): The date column to convert to a DataFrame.
        date_format (Optional[str]): The format of the date column.
        **kwargs: Additional keyword arguments to pass to the pd.DataFrame
            constructor.
    """
    if isinstance(data, ee.FeatureCollection):
        data = ee_to_df(data)
    elif isinstance(data, ee.List):
        data = data.getInfo()
        kwargs["columns"] = data[0]
        data = data[1:]

    super().__init__(data, **kwargs)

    if date_column is not None:
        self[date_column] = pd.to_datetime(
            self[date_column], format=date_format, errors="coerce"
        )

Feature_ByFeature (BarChart)

An object to define variables and get_data method for features by feature.

Source code in geemap/chart.py
class Feature_ByFeature(BarChart):
    """An object to define variables and get_data method for features by feature."""

    def __init__(
        self,
        features: Union[ee.FeatureCollection, pd.DataFrame],
        x_property: str,
        y_properties: List[str],
        name: str = "feature.byFeature",
        **kwargs: Any,
    ):
        """
        Initializes the Feature_ByFeature with the given features, x_property,
        y_properties, and name.

        Args:
            features (ee.FeatureCollection | pd.DataFrame): The features to plot.
            x_property (str): The property to use for the x-axis.
            y_properties (List[str]): The properties to use for the y-axis.
            name (str, optional): The name of the chart. Defaults to
                'feature.byFeature'.
            **kwargs: Additional keyword arguments to set as attributes.
        """
        default_labels = y_properties
        super().__init__(features, default_labels, name, **kwargs)
        self.x_data, self.y_data = self.get_data(x_property, y_properties)

    def get_data(
        self, x_property: str, y_properties: List[str]
    ) -> Tuple[List[Any], List[Any]]:
        """
        Gets the data for the chart.

        Args:
            x_property (str): The property to use for the x-axis.
            y_properties (List[str]): The properties to use for the y-axis.

        Returns:
            Tuple[List[Any], List[Any]]: The x and y data for the chart.
        """
        x_data = list(self.df[x_property])
        y_data = list(self.df[y_properties].values.T)
        return x_data, y_data

__init__(self, features, x_property, y_properties, name='feature.byFeature', **kwargs) special

Initializes the Feature_ByFeature with the given features, x_property, y_properties, and name.

Parameters:

Name Type Description Default
features ee.FeatureCollection | pd.DataFrame

The features to plot.

required
x_property str

The property to use for the x-axis.

required
y_properties List[str]

The properties to use for the y-axis.

required
name str

The name of the chart. Defaults to 'feature.byFeature'.

'feature.byFeature'
**kwargs Any

Additional keyword arguments to set as attributes.

{}
Source code in geemap/chart.py
def __init__(
    self,
    features: Union[ee.FeatureCollection, pd.DataFrame],
    x_property: str,
    y_properties: List[str],
    name: str = "feature.byFeature",
    **kwargs: Any,
):
    """
    Initializes the Feature_ByFeature with the given features, x_property,
    y_properties, and name.

    Args:
        features (ee.FeatureCollection | pd.DataFrame): The features to plot.
        x_property (str): The property to use for the x-axis.
        y_properties (List[str]): The properties to use for the y-axis.
        name (str, optional): The name of the chart. Defaults to
            'feature.byFeature'.
        **kwargs: Additional keyword arguments to set as attributes.
    """
    default_labels = y_properties
    super().__init__(features, default_labels, name, **kwargs)
    self.x_data, self.y_data = self.get_data(x_property, y_properties)

get_data(self, x_property, y_properties)

Gets the data for the chart.

Parameters:

Name Type Description Default
x_property str

The property to use for the x-axis.

required
y_properties List[str]

The properties to use for the y-axis.

required

Returns:

Type Description
Tuple[List[Any], List[Any]]

The x and y data for the chart.

Source code in geemap/chart.py
def get_data(
    self, x_property: str, y_properties: List[str]
) -> Tuple[List[Any], List[Any]]:
    """
    Gets the data for the chart.

    Args:
        x_property (str): The property to use for the x-axis.
        y_properties (List[str]): The properties to use for the y-axis.

    Returns:
        Tuple[List[Any], List[Any]]: The x and y data for the chart.
    """
    x_data = list(self.df[x_property])
    y_data = list(self.df[y_properties].values.T)
    return x_data, y_data

Feature_ByProperty (BarChart)

An object to define variables and get_data method for features by property.

Source code in geemap/chart.py
class Feature_ByProperty(BarChart):
    """An object to define variables and get_data method for features by property."""

    def __init__(
        self,
        features: Union[ee.FeatureCollection, pd.DataFrame],
        x_properties: Union[List[str], Dict[str, str]],
        series_property: str,
        name: str = "feature.byProperty",
        **kwargs: Any,
    ):
        """
        Initializes the Feature_ByProperty with the given features, x_properties,
        series_property, and name.

        Args:
            features (ee.FeatureCollection | pd.DataFrame): The features to plot.
            x_properties (List[str] | Dict[str, str]): The properties to use for
                the x-axis.
            series_property (str): The property to use for labeling the series.
            name (str, optional): The name of the chart. Defaults to
                'feature.byProperty'.
            **kwargs: Additional keyword arguments to set as attributes.

        Raises:
            Exception: If 'labels' is in kwargs.
        """
        default_labels = None
        super().__init__(features, default_labels, name, **kwargs)
        if "labels" in kwargs:
            raise Exception("Please remove labels in kwargs and try again.")

        self.labels = list(self.df[series_property])
        self.x_data, self.y_data = self.get_data(x_properties)

    def get_data(
        self, x_properties: Union[List[str], Dict[str, str]]
    ) -> Tuple[List[Any], List[Any]]:
        """
        Gets the data for the chart.

        Args:
            x_properties (List[str] | Dict[str, str]): The properties to use for
                the x-axis.

        Returns:
            Tuple[List[Any], List[Any]]: The x and y data for the chart.

        Raises:
            Exception: If x_properties is not a list or dictionary.
        """
        if isinstance(x_properties, list):
            x_data = x_properties
            y_data = self.df[x_properties].values
        elif isinstance(x_properties, dict):
            x_data = list(x_properties.values())
            y_data = self.df[list(x_properties.keys())].values
        else:
            raise Exception("x_properties must be a list or dictionary.")

        return x_data, y_data

__init__(self, features, x_properties, series_property, name='feature.byProperty', **kwargs) special

Initializes the Feature_ByProperty with the given features, x_properties, series_property, and name.

Parameters:

Name Type Description Default
features ee.FeatureCollection | pd.DataFrame

The features to plot.

required
x_properties List[str] | Dict[str, str]

The properties to use for the x-axis.

required
series_property str

The property to use for labeling the series.

required
name str

The name of the chart. Defaults to 'feature.byProperty'.

'feature.byProperty'
**kwargs Any

Additional keyword arguments to set as attributes.

{}

Exceptions:

Type Description
Exception

If 'labels' is in kwargs.

Source code in geemap/chart.py
def __init__(
    self,
    features: Union[ee.FeatureCollection, pd.DataFrame],
    x_properties: Union[List[str], Dict[str, str]],
    series_property: str,
    name: str = "feature.byProperty",
    **kwargs: Any,
):
    """
    Initializes the Feature_ByProperty with the given features, x_properties,
    series_property, and name.

    Args:
        features (ee.FeatureCollection | pd.DataFrame): The features to plot.
        x_properties (List[str] | Dict[str, str]): The properties to use for
            the x-axis.
        series_property (str): The property to use for labeling the series.
        name (str, optional): The name of the chart. Defaults to
            'feature.byProperty'.
        **kwargs: Additional keyword arguments to set as attributes.

    Raises:
        Exception: If 'labels' is in kwargs.
    """
    default_labels = None
    super().__init__(features, default_labels, name, **kwargs)
    if "labels" in kwargs:
        raise Exception("Please remove labels in kwargs and try again.")

    self.labels = list(self.df[series_property])
    self.x_data, self.y_data = self.get_data(x_properties)

get_data(self, x_properties)

Gets the data for the chart.

Parameters:

Name Type Description Default
x_properties List[str] | Dict[str, str]

The properties to use for the x-axis.

required

Returns:

Type Description
Tuple[List[Any], List[Any]]

The x and y data for the chart.

Exceptions:

Type Description
Exception

If x_properties is not a list or dictionary.

Source code in geemap/chart.py
def get_data(
    self, x_properties: Union[List[str], Dict[str, str]]
) -> Tuple[List[Any], List[Any]]:
    """
    Gets the data for the chart.

    Args:
        x_properties (List[str] | Dict[str, str]): The properties to use for
            the x-axis.

    Returns:
        Tuple[List[Any], List[Any]]: The x and y data for the chart.

    Raises:
        Exception: If x_properties is not a list or dictionary.
    """
    if isinstance(x_properties, list):
        x_data = x_properties
        y_data = self.df[x_properties].values
    elif isinstance(x_properties, dict):
        x_data = list(x_properties.values())
        y_data = self.df[list(x_properties.keys())].values
    else:
        raise Exception("x_properties must be a list or dictionary.")

    return x_data, y_data

Feature_Groups (BarChart)

An object to define variables and get_data method for feature groups.

Source code in geemap/chart.py
class Feature_Groups(BarChart):
    """An object to define variables and get_data method for feature groups."""

    def __init__(
        self,
        features: Union[ee.FeatureCollection, pd.DataFrame],
        x_property: str,
        y_property: str,
        series_property: str,
        name: str = "feature.groups",
        type: str = "stacked",
        **kwargs: Any,
    ):
        """
        Initializes the Feature_Groups with the given features, x_property,
        y_property, series_property, name, and type.

        Args:
            features (ee.FeatureCollection | pd.DataFrame): The features to plot.
            x_property (str): The property to use for the x-axis.
            y_property (str): The property to use for the y-axis.
            series_property (str): The property to use for labeling the series.
            name (str, optional): The name of the chart. Defaults to 'feature.groups'.
            type (str, optional): The type of bar chart ('grouped' or 'stacked').
                Defaults to 'stacked'.
            **kwargs: Additional keyword arguments to set as attributes.
        """
        df = ee_to_df(features)
        self.unique_series_values = df[series_property].unique().tolist()
        default_labels = [str(x) for x in self.unique_series_values]
        self.yProperty = y_property
        super().__init__(features, default_labels, name, type, **kwargs)

        self.new_column_names = self.get_column_names(series_property, y_property)
        self.x_data, self.y_data = self.get_data(x_property, self.new_column_names)

    def get_column_names(self, series_property: str, y_property: str) -> List[str]:
        """
        Gets the new column names for the DataFrame.

        Args:
            series_property (str): The property to use for labeling the series.
            y_property (str): The property to use for the y-axis.

        Returns:
            List[str]: The new column names.
        """
        new_column_names = []

        for value in self.unique_series_values:
            sample_filter = (self.df[series_property] == value).map({True: 1, False: 0})
            column_name = str(y_property)   "_"   str(value)
            self.df[column_name] = self.df[y_property] * sample_filter
            new_column_names.append(column_name)

        return new_column_names

    def get_data(
        self, x_property: str, new_column_names: List[str]
    ) -> Tuple[List[Any], List[Any]]:
        """
        Gets the data for the chart.

        Args:
            x_property (str): The property to use for the x-axis.
            new_column_names (List[str]): The new column names for the y-axis.

        Returns:
            Tuple[List[Any], List[Any]]: The x and y data for the chart.
        """
        x_data = list(self.df[x_property])
        y_data = [self.df[x] for x in new_column_names]

        return x_data, y_data

__init__(self, features, x_property, y_property, series_property, name='feature.groups', type='stacked', **kwargs) special

Initializes the Feature_Groups with the given features, x_property, y_property, series_property, name, and type.

Parameters:

Name Type Description Default
features ee.FeatureCollection | pd.DataFrame

The features to plot.

required
x_property str

The property to use for the x-axis.

required
y_property str

The property to use for the y-axis.

required
series_property str

The property to use for labeling the series.

required
name str

The name of the chart. Defaults to 'feature.groups'.

'feature.groups'
type str

The type of bar chart ('grouped' or 'stacked'). Defaults to 'stacked'.

'stacked'
**kwargs Any

Additional keyword arguments to set as attributes.

{}
Source code in geemap/chart.py
def __init__(
    self,
    features: Union[ee.FeatureCollection, pd.DataFrame],
    x_property: str,
    y_property: str,
    series_property: str,
    name: str = "feature.groups",
    type: str = "stacked",
    **kwargs: Any,
):
    """
    Initializes the Feature_Groups with the given features, x_property,
    y_property, series_property, name, and type.

    Args:
        features (ee.FeatureCollection | pd.DataFrame): The features to plot.
        x_property (str): The property to use for the x-axis.
        y_property (str): The property to use for the y-axis.
        series_property (str): The property to use for labeling the series.
        name (str, optional): The name of the chart. Defaults to 'feature.groups'.
        type (str, optional): The type of bar chart ('grouped' or 'stacked').
            Defaults to 'stacked'.
        **kwargs: Additional keyword arguments to set as attributes.
    """
    df = ee_to_df(features)
    self.unique_series_values = df[series_property].unique().tolist()
    default_labels = [str(x) for x in self.unique_series_values]
    self.yProperty = y_property
    super().__init__(features, default_labels, name, type, **kwargs)

    self.new_column_names = self.get_column_names(series_property, y_property)
    self.x_data, self.y_data = self.get_data(x_property, self.new_column_names)

get_column_names(self, series_property, y_property)

Gets the new column names for the DataFrame.

Parameters:

Name Type Description Default
series_property str

The property to use for labeling the series.

required
y_property str

The property to use for the y-axis.

required

Returns:

Type Description
List[str]

The new column names.

Source code in geemap/chart.py
def get_column_names(self, series_property: str, y_property: str) -> List[str]:
    """
    Gets the new column names for the DataFrame.

    Args:
        series_property (str): The property to use for labeling the series.
        y_property (str): The property to use for the y-axis.

    Returns:
        List[str]: The new column names.
    """
    new_column_names = []

    for value in self.unique_series_values:
        sample_filter = (self.df[series_property] == value).map({True: 1, False: 0})
        column_name = str(y_property)   "_"   str(value)
        self.df[column_name] = self.df[y_property] * sample_filter
        new_column_names.append(column_name)

    return new_column_names

get_data(self, x_property, new_column_names)

Gets the data for the chart.

Parameters:

Name Type Description Default
x_property str

The property to use for the x-axis.

required
new_column_names List[str]

The new column names for the y-axis.

required

Returns:

Type Description
Tuple[List[Any], List[Any]]

The x and y data for the chart.

Source code in geemap/chart.py
def get_data(
    self, x_property: str, new_column_names: List[str]
) -> Tuple[List[Any], List[Any]]:
    """
    Gets the data for the chart.

    Args:
        x_property (str): The property to use for the x-axis.
        new_column_names (List[str]): The new column names for the y-axis.

    Returns:
        Tuple[List[Any], List[Any]]: The x and y data for the chart.
    """
    x_data = list(self.df[x_property])
    y_data = [self.df[x] for x in new_column_names]

    return x_data, y_data

LineChart (BarChart)

A class to define variables and get_data method for a line chart.

Source code in geemap/chart.py
class LineChart(BarChart):
    """A class to define variables and get_data method for a line chart."""

    def __init__(
        self,
        features: Union[ee.FeatureCollection, pd.DataFrame],
        labels: List[str],
        name: str = "line.chart",
        **kwargs: Any,
    ):
        """
        Initializes the LineChart with the given features, labels, and name.

        Args:
            features (ee.FeatureCollection | pd.DataFrame): The features to plot.
            labels (List[str]): The labels for the chart.
            name (str, optional): The name of the chart. Defaults to 'line.chart'.
            **kwargs: Additional keyword arguments to set as attributes.
        """
        super().__init__(features, labels, name, **kwargs)

    def plot_chart(self) -> None:
        """
        Plots the line chart.
        """
        fig = plt.figure(
            title=self.title,
            legend_location=self.legend_location,
        )

        self.line_chart = plt.plot(
            self.x_data,
            self.y_data,
            label=self.labels,
        )

        self.generate_tooltip()
        plt.ylim(*self.get_ylim())
        if self.x_label:
            plt.xlabel(self.x_label)
        if self.y_label:
            plt.ylabel(self.y_label)

        if self.width:
            fig.layout.width = self.width
        if self.height:
            fig.layout.height = self.height

        plt.show()

__init__(self, features, labels, name='line.chart', **kwargs) special

Initializes the LineChart with the given features, labels, and name.

Parameters:

Name Type Description Default
features ee.FeatureCollection | pd.DataFrame

The features to plot.

required
labels List[str]

The labels for the chart.

required
name str

The name of the chart. Defaults to 'line.chart'.

'line.chart'
**kwargs Any

Additional keyword arguments to set as attributes.

{}
Source code in geemap/chart.py
def __init__(
    self,
    features: Union[ee.FeatureCollection, pd.DataFrame],
    labels: List[str],
    name: str = "line.chart",
    **kwargs: Any,
):
    """
    Initializes the LineChart with the given features, labels, and name.

    Args:
        features (ee.FeatureCollection | pd.DataFrame): The features to plot.
        labels (List[str]): The labels for the chart.
        name (str, optional): The name of the chart. Defaults to 'line.chart'.
        **kwargs: Additional keyword arguments to set as attributes.
    """
    super().__init__(features, labels, name, **kwargs)

plot_chart(self)

Plots the line chart.

Source code in geemap/chart.py
def plot_chart(self) -> None:
    """
    Plots the line chart.
    """
    fig = plt.figure(
        title=self.title,
        legend_location=self.legend_location,
    )

    self.line_chart = plt.plot(
        self.x_data,
        self.y_data,
        label=self.labels,
    )

    self.generate_tooltip()
    plt.ylim(*self.get_ylim())
    if self.x_label:
        plt.xlabel(self.x_label)
    if self.y_label:
        plt.ylabel(self.y_label)

    if self.width:
        fig.layout.width = self.width
    if self.height:
        fig.layout.height = self.height

    plt.show()

array_to_df(y_values, x_values=None, y_labels=None, x_label='x', axis=1, **kwargs)

Converts arrays or lists of y-values and optional x-values into a pandas DataFrame.

Parameters:

Name Type Description Default
y_values Union[ee.Array, ee.List, List[List[float]]]

The y-values to convert.

required
x_values Optional[Union[ee.Array, ee.List, List[float]]]

The x-values to convert. Defaults to None.

None
y_labels Optional[List[str]]

The labels for the y-values. Defaults to None.

None
x_label str

The label for the x-values. Defaults to "x".

'x'
axis int

The axis along which to transpose the y-values if needed. Defaults to 1.

1
**kwargs Any

Additional keyword arguments to pass to the pandas DataFrame constructor.

{}

Returns:

Type Description
pd.DataFrame

The resulting DataFrame.

Source code in geemap/chart.py
def array_to_df(
    y_values: Union[ee.Array, ee.List, List[List[float]]],
    x_values: Optional[Union[ee.Array, ee.List, List[float]]] = None,
    y_labels: Optional[List[str]] = None,
    x_label: str = "x",
    axis: int = 1,
    **kwargs: Any,
) -> pd.DataFrame:
    """
    Converts arrays or lists of y-values and optional x-values into a pandas DataFrame.

    Args:
        y_values (Union[ee.Array, ee.List, List[List[float]]]): The y-values to convert.
        x_values (Optional[Union[ee.Array, ee.List, List[float]]]): The x-values to convert.
            Defaults to None.
        y_labels (Optional[List[str]]): The labels for the y-values. Defaults to None.
        x_label (str): The label for the x-values. Defaults to "x".
        axis (int): The axis along which to transpose the y-values if needed. Defaults to 1.
        **kwargs: Additional keyword arguments to pass to the pandas DataFrame constructor.

    Returns:
        pd.DataFrame: The resulting DataFrame.
    """

    if isinstance(y_values, ee.Array) or isinstance(y_values, ee.List):
        y_values = y_values.getInfo()

    if isinstance(x_values, ee.Array) or isinstance(x_values, ee.List):
        x_values = x_values.getInfo()

    if axis == 0:
        y_values = np.transpose(y_values)

    if x_values is None:
        x_values = list(range(1, len(y_values[0])   1))

    data = {x_label: x_values}

    if not isinstance(y_values[0], list):
        y_values = [y_values]

    if y_labels is None:
        y_labels = [
            f"y{str(i 1).zfill(len(str(len(y_values))))}" for i in range(len(y_values))
        ]

    if len(y_labels) != len(y_values):
        raise ValueError("The length of y_labels must match the length of y_values.")

    for i, series in enumerate(y_labels):
        data[series] = y_values[i]

    df = pd.DataFrame(data, **kwargs)
    return df

array_values(array, x_labels=None, axis=1, series_names=None, chart_type='LineChart', colors=None, title=None, x_label=None, y_label=None, **kwargs)

Converts an array to a DataFrame and generates a chart.

Parameters:

Name Type Description Default
array Union[ee.Array, ee.List, List[List[float]]]

The array to convert.

required
x_labels Optional[Union[ee.Array, ee.List, List[float]]]

The labels for the x-axis. Defaults to None.

None
axis int

The axis along which to transpose the array if needed. Defaults to 1.

1
series_names Optional[List[str]]

The names of the series. Defaults to None.

None
chart_type str

The type of chart to create. Defaults to "LineChart".

'LineChart'
colors Optional[List[str]]

The colors to use for the chart. Defaults to None.

None
title Optional[str]

The title of the chart. Defaults to None.

None
x_label Optional[str]

The label for the x-axis. Defaults to None.

None
y_label Optional[str]

The label for the y-axis. Defaults to None.

None
**kwargs Any

Additional keyword arguments to pass to the Chart constructor.

{}

Returns:

Type Description
Chart

The generated chart.

Source code in geemap/chart.py
def array_values(
    array: Union[ee.Array, ee.List, List[List[float]]],
    x_labels: Optional[Union[ee.Array, ee.List, List[float]]] = None,
    axis: int = 1,
    series_names: Optional[List[str]] = None,
    chart_type: str = "LineChart",
    colors: Optional[List[str]] = None,
    title: Optional[str] = None,
    x_label: Optional[str] = None,
    y_label: Optional[str] = None,
    **kwargs: Any,
) -> Chart:
    """
    Converts an array to a DataFrame and generates a chart.

    Args:
        array (Union[ee.Array, ee.List, List[List[float]]]): The array to convert.
        x_labels (Optional[Union[ee.Array, ee.List, List[float]]]): The labels
            for the x-axis. Defaults to None.
        axis (int): The axis along which to transpose the array if needed. Defaults to 1.
        series_names (Optional[List[str]]): The names of the series. Defaults to None.
        chart_type (str): The type of chart to create. Defaults to "LineChart".
        colors (Optional[List[str]]): The colors to use for the chart. Defaults to None.
        title (Optional[str]): The title of the chart. Defaults to None.
        x_label (Optional[str]): The label for the x-axis. Defaults to None.
        y_label (Optional[str]): The label for the y-axis. Defaults to None.
        **kwargs: Additional keyword arguments to pass to the Chart constructor.

    Returns:
        Chart: The generated chart.
    """

    df = array_to_df(array, x_values=x_labels, y_labels=series_names, axis=axis)
    fig = Chart(
        df,
        x_cols=["x"],
        y_cols=df.columns.tolist()[1:],
        chart_type=chart_type,
        colors=colors,
        title=title,
        x_label=x_label,
        y_label=y_label,
        **kwargs,
    )
    return fig

doy_series_by_year(image_collection, band_name, region=None, region_reducer=None, scale=None, same_day_reducer=None, start_day=1, end_day=366, chart_type='LineChart', colors=None, title=None, x_label=None, y_label=None, **kwargs)

Generates a time series chart of an image collection for a specific region over multiple years.

Parameters:

Name Type Description Default
image_collection ee.ImageCollection

The image collection to analyze.

required
band_name str

The name of the band to analyze.

required
region Optional[Union[ee.Geometry, ee.FeatureCollection]]

The region to analyze.

None
region_reducer Optional[Union[str, ee.Reducer]]

The reducer type for zonal statistics.

None
scale Optional[int]

The scale in meters at which to perform the analysis.

None
same_day_reducer Optional[Union[str, ee.Reducer]]

The reducer type for daily statistics.

None
start_day int

The start day of the year.

1
end_day int

The end day of the year.

366
chart_type str

The type of chart to create. Supported types are 'ScatterChart', 'LineChart', 'ColumnChart', 'BarChart', 'PieChart', 'AreaChart', and 'Table'.

'LineChart'
colors Optional[List[str]]

The colors to use for the chart. Defaults to a predefined list of colors.

None
title Optional[str]

The title of the chart. Defaults to the chart type.

None
x_label Optional[str]

The label for the x-axis. Defaults to an empty string.

None
y_label Optional[str]

The label for the y-axis. Defaults to an empty string.

None
**kwargs Any

Additional keyword arguments to pass to the bqplot Figure or mark objects. For axes_options, see https://bqplot.github.io/bqplot/api/axes

{}

Returns:

Type Description
Chart

The generated chart.

Source code in geemap/chart.py
def doy_series_by_year(
    image_collection: ee.ImageCollection,
    band_name: str,
    region: Optional[Union[ee.Geometry, ee.FeatureCollection]] = None,
    region_reducer: Optional[Union[str, ee.Reducer]] = None,
    scale: Optional[int] = None,
    same_day_reducer: Optional[Union[str, ee.Reducer]] = None,
    start_day: int = 1,
    end_day: int = 366,
    chart_type: str = "LineChart",
    colors: Optional[List[str]] = None,
    title: Optional[str] = None,
    x_label: Optional[str] = None,
    y_label: Optional[str] = None,
    **kwargs: Any,
) -> Chart:
    """
    Generates a time series chart of an image collection for a specific region
    over multiple years.

    Args:
        image_collection (ee.ImageCollection): The image collection to analyze.
        band_name (str): The name of the band to analyze.
        region (Optional[Union[ee.Geometry, ee.FeatureCollection]]): The region
            to analyze.
        region_reducer (Optional[Union[str, ee.Reducer]]): The reducer type for
            zonal statistics.
        scale (Optional[int]): The scale in meters at which to perform the analysis.
        same_day_reducer (Optional[Union[str, ee.Reducer]]): The reducer type
            for daily statistics.
        start_day (int): The start day of the year.
        end_day (int): The end day of the year.
        chart_type (str): The type of chart to create. Supported types are
            'ScatterChart', 'LineChart', 'ColumnChart', 'BarChart',
            'PieChart', 'AreaChart', and 'Table'.
        colors (Optional[List[str]]): The colors to use for the chart.
            Defaults to a predefined list of colors.
        title (Optional[str]): The title of the chart. Defaults to the
            chart type.
        x_label (Optional[str]): The label for the x-axis. Defaults to an
            empty string.
        y_label (Optional[str]): The label for the y-axis. Defaults to an
            empty string.
        **kwargs: Additional keyword arguments to pass to the bqplot Figure
            or mark objects. For axes_options, see
            https://bqplot.github.io/bqplot/api/axes

    Returns:
        Chart: The generated chart.
    """

    # Function to add day-of-year ('doy') and year properties to each image.
    def set_doys(collection):
        def add_doy(img):
            date = img.date()
            year = date.get("year")
            doy = date.getRelative("day", "year").floor().add(1)
            return img.set({"doy": doy, "year": year})

        return collection.map(add_doy)

    # Set default values and filters if parameters are not provided.
    region_reducer = region_reducer or ee.Reducer.mean()
    same_day_reducer = same_day_reducer or ee.Reducer.mean()

    # Optionally filter the image collection by region.
    filtered_collection = image_collection
    if region:
        filtered_collection = filtered_collection.filterBounds(region)
    filtered_collection = set_doys(filtered_collection)

    # Filter image collection by day of year.
    filtered_collection = filtered_collection.filter(
        ee.Filter.calendarRange(start_day, end_day, "day_of_year")
    )

    # Generate a feature for each (doy, value, year) combination.
    def create_feature(image):
        value = (
            image.select(band_name)
            .reduceRegion(reducer=region_reducer, geometry=region, scale=scale)
            .get(band_name)
        )  # Get the reduced value for the given band.
        return ee.Feature(
            None, {"doy": image.get("doy"), "year": image.get("year"), "value": value}
        )

    tuples = filtered_collection.map(create_feature)

    # Group by unique (doy, year) pairs.
    distinct_doy_year = tuples.distinct(["doy", "year"])

    # Join the original tuples with the distinct (doy, year) pairs.
    filter = ee.Filter.And(
        ee.Filter.equals(leftField="doy", rightField="doy"),
        ee.Filter.equals(leftField="year", rightField="year"),
    )
    joined = ee.Join.saveAll("matches").apply(
        primary=distinct_doy_year, secondary=tuples, condition=filter
    )

    # For each (doy, year), reduce the values of the joined features.
    def reduce_features(doy_year):
        features = ee.FeatureCollection(ee.List(doy_year.get("matches")))
        value = features.aggregate_array("value").reduce(same_day_reducer)
        return doy_year.set("value", value)

    reduced = joined.map(reduce_features)

    df = ee_to_df(reduced, columns=["doy", "year", "value"])
    df = pivot_df(df, index="doy", columns="year", values="value")
    y_cols = df.columns.tolist()[1:]
    x_cols = "doy"

    fig = Chart(
        df,
        chart_type,
        x_cols,
        y_cols,
        colors,
        title,
        x_label,
        y_label,
        **kwargs,
    )
    return fig

feature_by_feature(features, x_property, y_properties, **kwargs)

Generates a Chart from a set of features. Plots the value of one or more properties for each feature. Reference: https://developers.google.com/earth-engine/guides/charts_feature#uichartfeaturebyfeature

Parameters:

Name Type Description Default
features ee.FeatureCollection

The feature collection to generate a chart from.

required
x_property str

Features labeled by x_property.

required
y_properties List[str]

Values of y_properties.

required
**kwargs Any

Additional keyword arguments to set as attributes.

{}

Exceptions:

Type Description
Exception

Errors when creating the chart.

Source code in geemap/chart.py
def feature_by_feature(
    features: ee.FeatureCollection,
    x_property: str,
    y_properties: List[str],
    **kwargs: Any,
) -> None:
    """
    Generates a Chart from a set of features. Plots the value of one or more
    properties for each feature.
    Reference: https://developers.google.com/earth-engine/guides/charts_feature#uichartfeaturebyfeature

    Args:
        features (ee.FeatureCollection): The feature collection to generate a chart from.
        x_property (str): Features labeled by x_property.
        y_properties (List[str]): Values of y_properties.
        **kwargs: Additional keyword arguments to set as attributes.

    Raises:
        Exception: Errors when creating the chart.
    """
    bar = Feature_ByFeature(
        features=features, x_property=x_property, y_properties=y_properties, **kwargs
    )

    try:
        bar.plot_chart()
    except Exception as e:
        raise Exception(e)

feature_by_property(features, x_properties, series_property, **kwargs)

Generates a Chart from a set of features. Plots property values of one or more features. Reference: https://developers.google.com/earth-engine/guides/charts_feature#uichartfeaturebyproperty

Parameters:

Name Type Description Default
features ee.FeatureCollection

The features to include in the chart.

required
x_properties list | dict

One of (1) a list of properties to be plotted on the x-axis; or (2) a (property, label) dictionary specifying labels for properties to be used as values on the x-axis.

required
series_property str

The name of the property used to label each feature in the legend.

required

Exceptions:

Type Description
Exception

If the provided xProperties is not a list or dict.

Exception

If the chart fails to create.

Source code in geemap/chart.py
def feature_by_property(
    features: ee.FeatureCollection,
    x_properties: Union[list, dict],
    series_property: str,
    **kwargs,
):
    """Generates a Chart from a set of features. Plots property values of one or
     more features.
    Reference: https://developers.google.com/earth-engine/guides/charts_feature#uichartfeaturebyproperty

    Args:
        features (ee.FeatureCollection): The features to include in the chart.
        x_properties (list | dict): One of (1) a list of properties to be
            plotted on the x-axis; or (2) a (property, label) dictionary
            specifying labels for properties to be used as values on the x-axis.
        series_property (str): The name of the property used to label each
            feature in the legend.

    Raises:
        Exception: If the provided xProperties is not a list or dict.
        Exception: If the chart fails to create.
    """
    bar = Feature_ByProperty(
        features=features,
        x_properties=x_properties,
        series_property=series_property,
        **kwargs,
    )

    try:
        bar.plot_chart()

    except Exception as e:
        raise Exception(e)

feature_groups(features, x_property, y_property, series_property, **kwargs)

Generates a Chart from a set of features. Plots the value of one property for each feature.

Reference: https://developers.google.com/earth-engine/guides/charts_feature#uichartfeaturegroups

Parameters:

Name Type Description Default
features ee.FeatureCollection

The feature collection to make a chart from.

required
x_property str

Features labeled by xProperty.

required
y_property str

Features labeled by yProperty.

required
series_property str

The property used to label each feature in the legend.

required
**kwargs Any

Additional keyword arguments to set as attributes.

{}

Exceptions:

Type Description
Exception

Errors when creating the chart.

Source code in geemap/chart.py
def feature_groups(
    features: ee.FeatureCollection,
    x_property: str,
    y_property: str,
    series_property: str,
    **kwargs: Any,
) -> None:
    """
    Generates a Chart from a set of features.
    Plots the value of one property for each feature.

    Reference:
    https://developers.google.com/earth-engine/guides/charts_feature#uichartfeaturegroups

    Args:
        features (ee.FeatureCollection): The feature collection to make a chart from.
        x_property (str): Features labeled by xProperty.
        y_property (str): Features labeled by yProperty.
        series_property (str): The property used to label each feature in the legend.
        **kwargs: Additional keyword arguments to set as attributes.

    Raises:
        Exception: Errors when creating the chart.
    """

    bar = Feature_Groups(
        features=features,
        x_property=x_property,
        y_property=y_property,
        series_property=series_property,
        **kwargs,
    )

    try:
        bar.plot_chart()

    except Exception as e:
        raise Exception(e)

feature_histogram(features, property, max_buckets=None, min_bucket_width=None, show=True, **kwargs)

Generates a Chart from a set of features. Computes and plots a histogram of the given property. - X-axis = Histogram buckets (of property value). - Y-axis = Frequency

Reference: https://developers.google.com/earth-engine/guides/charts_feature#uichartfeaturehistogram

Parameters:

Name Type Description Default
features ee.FeatureCollection

The features to include in the chart.

required
property str

The name of the property to generate the histogram for.

required
max_buckets int

The maximum number of buckets (bins) to use when building a histogram; will be rounded up to a power of 2.

None
min_bucket_width float

The minimum histogram bucket width, or null to allow any power of 2.

None
show bool

Whether to show the chart. If not, it will return the bqplot chart object, which can be used to retrieve data for the chart. Defaults to True.

True
**kwargs Any

Additional keyword arguments to set as attributes.

{}

Exceptions:

Type Description
Exception

If the provided xProperties is not a list or dict.

Exception

If the chart fails to create.

Returns:

Type Description
Optional[Any]

The bqplot chart object if show is False, otherwise None.

Source code in geemap/chart.py
def feature_histogram(
    features: ee.FeatureCollection,
    property: str,
    max_buckets: Optional[int] = None,
    min_bucket_width: Optional[float] = None,
    show: bool = True,
    **kwargs: Any,
) -> Optional[Any]:
    """
    Generates a Chart from a set of features.
    Computes and plots a histogram of the given property.
    - X-axis = Histogram buckets (of property value).
    - Y-axis = Frequency

    Reference:
    https://developers.google.com/earth-engine/guides/charts_feature#uichartfeaturehistogram

    Args:
        features (ee.FeatureCollection): The features to include in the chart.
        property (str): The name of the property to generate the histogram for.
        max_buckets (int, optional): The maximum number of buckets (bins) to use
            when building a histogram; will be rounded up to a power of 2.
        min_bucket_width (float, optional): The minimum histogram bucket width,
            or null to allow any power of 2.
        show (bool, optional): Whether to show the chart. If not, it will return
            the bqplot chart object, which can be used to retrieve data for the
            chart. Defaults to True.
        **kwargs: Additional keyword arguments to set as attributes.

    Raises:
        Exception: If the provided xProperties is not a list or dict.
        Exception: If the chart fails to create.

    Returns:
        Optional[Any]: The bqplot chart object if show is False, otherwise None.
    """
    import math

    if not isinstance(features, ee.FeatureCollection):
        raise Exception("features must be an ee.FeatureCollection")

    first = features.first()
    props = first.propertyNames().getInfo()
    if property not in props:
        raise Exception(
            f"property {property} not found. Available properties: {', '.join(props)}"
        )

    def nextPowerOf2(n):
        return pow(2, math.ceil(math.log2(n)))

    def grow_bin(bin_size, ref):
        while bin_size < ref:
            bin_size *= 2
        return bin_size

    try:
        raw_data = pd.to_numeric(
            pd.Series(features.aggregate_array(property).getInfo())
        )
        y_data = raw_data.tolist()

        if "ylim" in kwargs:
            min_value = kwargs["ylim"][0]
            max_value = kwargs["ylim"][1]
        else:
            min_value = raw_data.min()
            max_value = raw_data.max()

        data_range = max_value - min_value

        if not max_buckets:
            initial_bin_size = nextPowerOf2(data_range / pow(2, 8))
            if min_bucket_width:
                if min_bucket_width < initial_bin_size:
                    bin_size = grow_bin(min_bucket_width, initial_bin_size)
                else:
                    bin_size = min_bucket_width
            else:
                bin_size = initial_bin_size
        else:
            initial_bin_size = math.ceil(data_range / nextPowerOf2(max_buckets))
            if min_bucket_width:
                if min_bucket_width < initial_bin_size:
                    bin_size = grow_bin(min_bucket_width, initial_bin_size)
                else:
                    bin_size = min_bucket_width
            else:
                bin_size = initial_bin_size

        start_bins = (math.floor(min_value / bin_size) * bin_size) - (bin_size / 2)
        end_bins = (math.ceil(max_value / bin_size) * bin_size)   (bin_size / 2)

        if start_bins < min_value:
            y_data.append(start_bins)
        else:
            y_data[y_data.index(min_value)] = start_bins
        if end_bins > max_value:
            y_data.append(end_bins)
        else:
            y_data[y_data.index(max_value)] = end_bins

        num_bins = math.floor((end_bins - start_bins) / bin_size)

        if "title" not in kwargs:
            title = ""
        else:
            title = kwargs["title"]

        fig = plt.figure(title=title)

        if "width" in kwargs:
            fig.layout.width = kwargs["width"]
        if "height" in kwargs:
            fig.layout.height = kwargs["height"]

        if "x_label" not in kwargs:
            x_label = ""
        else:
            x_label = kwargs["x_label"]

        if "y_label" not in kwargs:
            y_label = ""
        else:
            y_label = kwargs["y_label"]

        histogram = plt.hist(
            sample=y_data,
            bins=num_bins,
            axes_options={"count": {"label": y_label}, "sample": {"label": x_label}},
        )

        if "colors" in kwargs:
            histogram.colors = kwargs["colors"]
        if "stroke" in kwargs:
            histogram.stroke = kwargs["stroke"]
        else:
            histogram.stroke = "#ffffff00"
        if "stroke_width" in kwargs:
            histogram.stroke_width = kwargs["stroke_width"]
        else:
            histogram.stroke_width = 0

        if ("x_label" in kwargs) and ("y_label" in kwargs):
            histogram.tooltip = Tooltip(
                fields=["midpoint", "count"],
                labels=[kwargs["x_label"], kwargs["y_label"]],
            )
        else:
            histogram.tooltip = Tooltip(fields=["midpoint", "count"])

        if show:
            plt.show()
        else:
            return histogram

    except Exception as e:
        raise Exception(e)

image_by_class(image, class_band, region, reducer='MEAN', scale=None, class_labels=None, x_labels=None, chart_type='LineChart', **kwargs)

Generates a Chart from an image by class. Extracts and plots band values by class.

Parameters:

Name Type Description Default
image ee.Image

Image to extract band values from.

required
class_band str

The band name to use as class labels.

required
region ee.Geometry | ee.FeatureCollection

The region(s) to reduce.

required
reducer str | ee.Reducer

The reducer type for zonal statistics. Can be one of 'mean', 'median', 'sum', 'min', 'max', etc. Defaults to 'MEAN'.

'MEAN'
scale int

The scale in meters at which to perform the analysis.

None
class_labels List[str]

List of class labels.

None
x_labels List[str]

List of x-axis labels.

None
chart_type str

The type of chart to create. Supported types are 'ScatterChart', 'LineChart', 'ColumnChart', 'BarChart', 'PieChart', 'AreaChart', and 'Table'. Defaults to 'LineChart'.

'LineChart'
**kwargs Any

Additional keyword arguments.

{}

Returns:

Type Description
Any

The generated chart.

Source code in geemap/chart.py
def image_by_class(
    image: ee.Image,
    class_band: str,
    region: Union[ee.Geometry, ee.FeatureCollection],
    reducer: Union[str, ee.Reducer] = "MEAN",
    scale: Optional[int] = None,
    class_labels: Optional[List[str]] = None,
    x_labels: Optional[List[str]] = None,
    chart_type: str = "LineChart",
    **kwargs: Any,
) -> Any:
    """
    Generates a Chart from an image by class. Extracts and plots band values by class.

    Args:
        image (ee.Image): Image to extract band values from.
        class_band (str): The band name to use as class labels.
        region (ee.Geometry | ee.FeatureCollection): The region(s) to reduce.
        reducer (str | ee.Reducer, optional): The reducer type for zonal statistics. Can
            be one of 'mean', 'median', 'sum', 'min', 'max', etc. Defaults to 'MEAN'.
        scale (int, optional): The scale in meters at which to perform the analysis.
        class_labels (List[str], optional): List of class labels.
        x_labels (List[str], optional): List of x-axis labels.
        chart_type (str, optional): The type of chart to create. Supported types are
            'ScatterChart', 'LineChart', 'ColumnChart', 'BarChart', 'PieChart',
            'AreaChart', and 'Table'. Defaults to 'LineChart'.
        **kwargs: Additional keyword arguments.

    Returns:
        Any: The generated chart.
    """
    fc = zonal_stats(
        image, region, stat_type=reducer, scale=scale, verbose=False, return_fc=True
    )
    bands = image.bandNames().getInfo()
    df = ee_to_df(fc)[bands   [class_band]]

    df_transposed = df.set_index(class_band).T

    if x_labels is not None:
        df_transposed["label"] = x_labels
    else:
        df_transposed["label"] = df_transposed.index

    if class_labels is None:
        y_cols = df_transposed.columns.tolist()
        y_cols.remove("label")
    else:
        y_cols = class_labels

    fig = Chart(
        df_transposed, chart_type=chart_type, x_cols="label", y_cols=y_cols, **kwargs
    )
    return fig

image_by_region(image, regions, reducer, scale, x_property, **kwargs)

Generates a Chart from an image. Extracts and plots band values in one or more regions in the image, with each band in a separate series.

Parameters:

Name Type Description Default
image ee.Image

Image to extract band values from.

required
regions ee.FeatureCollection | ee.Geometry

Regions to reduce. Defaults to the image's footprint.

required
reducer str | ee.Reducer

The reducer type for zonal statistics. Can be one of 'mean', 'median', 'sum', 'min', 'max', etc.

required
scale int

The scale in meters at which to perform the analysis.

required
x_property str

The name of the property in the feature collection to use as the x-axis values.

required
**kwargs Any

Additional keyword arguments to be passed to the feature_by_feature function.

{}

Returns:

Type Description
None

None

Source code in geemap/chart.py
def image_by_region(
    image: ee.Image,
    regions: Union[ee.FeatureCollection, ee.Geometry],
    reducer: Union[str, ee.Reducer],
    scale: int,
    x_property: str,
    **kwargs: Any,
) -> None:
    """
    Generates a Chart from an image. Extracts and plots band values in one or more
    regions in the image, with each band in a separate series.

    Args:
        image (ee.Image): Image to extract band values from.
        regions (ee.FeatureCollection | ee.Geometry): Regions to reduce.
            Defaults to the image's footprint.
        reducer (str | ee.Reducer): The reducer type for zonal statistics. Can
            be one of 'mean', 'median', 'sum', 'min', 'max', etc.
        scale (int): The scale in meters at which to perform the analysis.
        x_property (str): The name of the property in the feature collection to
            use as the x-axis values.
        **kwargs: Additional keyword arguments to be passed to the
            `feature_by_feature` function.

    Returns:
        None
    """

    fc = zonal_stats(
        image, regions, stat_type=reducer, scale=scale, verbose=False, return_fc=True
    )
    bands = image.bandNames().getInfo()
    df = ee_to_df(fc)[bands   [x_property]]
    feature_by_feature(df, x_property, bands, **kwargs)

image_doy_series(image_collection, region=None, region_reducer=None, scale=None, year_reducer=None, start_day=1, end_day=366, chart_type='LineChart', colors=None, title=None, x_label=None, y_label=None, **kwargs)

Generates a time series chart of an image collection for a specific region over a range of days of the year.

Parameters:

Name Type Description Default
image_collection ee.ImageCollection

The image collection to analyze.

required
region Optional[Union[ee.Geometry, ee.FeatureCollection]]

The region to reduce.

None
region_reducer Optional[Union[str, ee.Reducer]]

The reducer type for zonal statistics.Can be one of 'mean', 'median', 'sum', 'min', 'max', etc.

None
scale Optional[int]

The scale in meters at which to perform the analysis.

None
year_reducer Optional[Union[str, ee.Reducer]]

The reducer type for yearly statistics.

None
start_day int

The start day of the year.

1
end_day int

The end day of the year.

366
chart_type str

The type of chart to create. Supported types are 'ScatterChart', 'LineChart', 'ColumnChart', 'BarChart', 'PieChart', 'AreaChart', and 'Table'.

'LineChart'
colors Optional[List[str]]

The colors to use for the chart. Defaults to a predefined list of colors.

None
title Optional[str]

The title of the chart. Defaults to the chart type.

None
x_label Optional[str]

The label for the x-axis. Defaults to an empty string.

None
y_label Optional[str]

The label for the y-axis. Defaults to an empty string.

None
**kwargs Any

Additional keyword arguments to pass to the bqplot Figure or mark objects. For axes_options, see https://bqplot.github.io/bqplot/api/axes

{}

Returns:

Type Description
Chart

The generated chart.

Source code in geemap/chart.py
def image_doy_series(
    image_collection: ee.ImageCollection,
    region: Optional[Union[ee.Geometry, ee.FeatureCollection]] = None,
    region_reducer: Optional[Union[str, ee.Reducer]] = None,
    scale: Optional[int] = None,
    year_reducer: Optional[Union[str, ee.Reducer]] = None,
    start_day: int = 1,
    end_day: int = 366,
    chart_type: str = "LineChart",
    colors: Optional[List[str]] = None,
    title: Optional[str] = None,
    x_label: Optional[str] = None,
    y_label: Optional[str] = None,
    **kwargs: Any,
) -> Chart:
    """
    Generates a time series chart of an image collection for a specific region
        over a range of days of the year.

    Args:
        image_collection (ee.ImageCollection): The image collection to analyze.
        region (Optional[Union[ee.Geometry, ee.FeatureCollection]]): The region
            to reduce.
        region_reducer (Optional[Union[str, ee.Reducer]]): The reducer type for
            zonal statistics.Can be one of 'mean', 'median', 'sum', 'min', 'max', etc.
        scale (Optional[int]): The scale in meters at which to perform the analysis.
        year_reducer (Optional[Union[str, ee.Reducer]]): The reducer type for
            yearly statistics.
        start_day (int): The start day of the year.
        end_day (int): The end day of the year.
        chart_type (str): The type of chart to create. Supported types are
            'ScatterChart', 'LineChart', 'ColumnChart', 'BarChart',
            'PieChart', 'AreaChart', and 'Table'.
        colors (Optional[List[str]]): The colors to use for the chart.
            Defaults to a predefined list of colors.
        title (Optional[str]): The title of the chart. Defaults to the
            chart type.
        x_label (Optional[str]): The label for the x-axis. Defaults to an
            empty string.
        y_label (Optional[str]): The label for the y-axis. Defaults to an
            empty string.
        **kwargs: Additional keyword arguments to pass to the bqplot Figure
            or mark objects. For axes_options, see
            https://bqplot.github.io/bqplot/api/axes

    Returns:
        Chart: The generated chart.
    """

    # Function to add day-of-year ('doy') and year properties to each image.
    def set_doys(collection):
        def add_doy(img):
            date = img.date()
            year = date.get("year")
            doy = date.getRelative("day", "year").floor().add(1)
            return img.set({"doy": doy, "year": year})

        return collection.map(add_doy)

    # Reduces images with the same day of year.
    def group_by_doy(collection, start, end, reducer):
        collection = set_doys(collection)

        doys = ee.FeatureCollection(
            [ee.Feature(None, {"doy": i}) for i in range(start, end   1)]
        )

        # Group images by their day of year.
        filter = ee.Filter(ee.Filter.equals(leftField="doy", rightField="doy"))
        joined = ee.Join.saveAll("matches").apply(
            primary=doys, secondary=collection, condition=filter
        )

        # For each DoY, reduce images across years.
        def reduce_images(doy):
            images = ee.ImageCollection.fromImages(doy.get("matches"))
            image = images.reduce(reducer)
            return image.set(
                {
                    "doy": doy.get("doy"),
                    "geo": images.geometry(),  # // Retain geometry for future reduceRegion.
                }
            )

        return ee.ImageCollection(joined.map(reduce_images))

    # Set default values and filters if parameters are not provided.
    region_reducer = region_reducer or ee.Reducer.mean()
    year_reducer = year_reducer or ee.Reducer.mean()

    # Optionally filter the image collection by region.
    filtered_collection = image_collection
    if region:
        filtered_collection = filtered_collection.filterBounds(region)
    filtered_collection = set_doys(filtered_collection)

    doy_images = group_by_doy(filtered_collection, start_day, end_day, year_reducer)

    # For each DoY, reduce images across years within the region.
    def reduce_doy_images(image):
        region_for_image = region if region else image.get("geo")
        dictionary = image.reduceRegion(
            reducer=region_reducer, geometry=region_for_image, scale=scale
        )

        return ee.Feature(None, {"doy": image.get("doy")}).set(dictionary)

    reduced = ee.FeatureCollection(doy_images.map(reduce_doy_images))

    df = ee_to_df(reduced)
    df.columns = df.columns.str.replace(r"_.*", "", regex=True)

    x_cols = "doy"
    y_cols = df.columns.tolist()
    y_cols.remove("doy")

    fig = Chart(
        df,
        chart_type,
        x_cols,
        y_cols,
        colors,
        title,
        x_label,
        y_label,
        **kwargs,
    )
    return fig

image_doy_series_by_region(image_collection, band_name, regions, region_reducer=None, scale=None, year_reducer=None, series_property=None, start_day=1, end_day=366, chart_type='LineChart', colors=None, title=None, x_label=None, y_label=None, **kwargs)

Generates a time series chart of an image collection for multiple regions over a range of days of the year.

Parameters:

Name Type Description Default
image_collection ee.ImageCollection

The image collection to analyze.

required
band_name str

The name of the band to analyze.

required
regions ee.FeatureCollection

The regions to analyze.

required
region_reducer Optional[Union[str, ee.Reducer]]

The reducer type for zonal statistics.

None
scale Optional[int]

The scale in meters at which to perform the analysis.

None
year_reducer Optional[Union[str, ee.Reducer]]

The reducer type for yearly statistics.

None
series_property Optional[str]

The property to use for labeling the series.

None
start_day int

The start day of the year.

1
end_day int

The end day of the year.

366
chart_type str

The type of chart to create. Supported types are 'ScatterChart', 'LineChart', 'ColumnChart', 'BarChart', 'PieChart', 'AreaChart', and 'Table'.

'LineChart'
colors Optional[List[str]]

The colors to use for the chart. Defaults to a predefined list of colors.

None
title Optional[str]

The title of the chart. Defaults to the chart type.

None
x_label Optional[str]

The label for the x-axis. Defaults to an empty string.

None
y_label Optional[str]

The label for the y-axis. Defaults to an empty string.

None
**kwargs Any

Additional keyword arguments to pass to the bqplot Figure or mark objects. For axes_options, see https://bqplot.github.io/bqplot/api/axes

{}

Returns:

Type Description
Chart

The generated chart.

Source code in geemap/chart.py
def image_doy_series_by_region(
    image_collection: ee.ImageCollection,
    band_name: str,
    regions: ee.FeatureCollection,
    region_reducer: Optional[Union[str, ee.Reducer]] = None,
    scale: Optional[int] = None,
    year_reducer: Optional[Union[str, ee.Reducer]] = None,
    series_property: Optional[str] = None,
    start_day: int = 1,
    end_day: int = 366,
    chart_type: str = "LineChart",
    colors: Optional[List[str]] = None,
    title: Optional[str] = None,
    x_label: Optional[str] = None,
    y_label: Optional[str] = None,
    **kwargs: Any,
) -> Chart:
    """
    Generates a time series chart of an image collection for multiple regions
    over a range of days of the year.

    Args:
        image_collection (ee.ImageCollection): The image collection to analyze.
        band_name (str): The name of the band to analyze.
        regions (ee.FeatureCollection): The regions to analyze.
        region_reducer (Optional[Union[str, ee.Reducer]]): The reducer type for
            zonal statistics.
        scale (Optional[int]): The scale in meters at which to perform the analysis.
        year_reducer (Optional[Union[str, ee.Reducer]]): The reducer type for
            yearly statistics.
        series_property (Optional[str]): The property to use for labeling the series.
        start_day (int): The start day of the year.
        end_day (int): The end day of the year.
        chart_type (str): The type of chart to create. Supported types are
            'ScatterChart', 'LineChart', 'ColumnChart', 'BarChart',
            'PieChart', 'AreaChart', and 'Table'.
        colors (Optional[List[str]]): The colors to use for the chart.
            Defaults to a predefined list of colors.
        title (Optional[str]): The title of the chart. Defaults to the
            chart type.
        x_label (Optional[str]): The label for the x-axis. Defaults to an
            empty string.
        y_label (Optional[str]): The label for the y-axis. Defaults to an
            empty string.
        **kwargs: Additional keyword arguments to pass to the bqplot Figure
            or mark objects. For axes_options, see
            https://bqplot.github.io/bqplot/api/axes

    Returns:
        Chart: The generated chart.
    """

    image_collection = image_collection.select(band_name)

    # Function to add day-of-year ('doy') and year properties to each image.
    def set_doys(collection):
        def add_doy(img):
            date = img.date()
            year = date.get("year")
            doy = date.getRelative("day", "year").floor().add(1)
            return img.set({"doy": doy, "year": year})

        return collection.map(add_doy)

    # Reduces images with the same day of year.
    def group_by_doy(collection, start, end, reducer):
        collection = set_doys(collection)

        doys = ee.FeatureCollection(
            [ee.Feature(None, {"doy": i}) for i in range(start, end   1)]
        )

        # Group images by their day of year.
        filter = ee.Filter(ee.Filter.equals(leftField="doy", rightField="doy"))
        joined = ee.Join.saveAll("matches").apply(
            primary=doys, secondary=collection, condition=filter
        )

        # For each DoY, reduce images across years.
        def reduce_images(doy):
            images = ee.ImageCollection.fromImages(doy.get("matches"))
            image = images.reduce(reducer)
            return image.set(
                {
                    "doy": doy.get("doy"),
                    "geo": images.geometry(),  # // Retain geometry for future reduceRegion.
                }
            )

        return ee.ImageCollection(joined.map(reduce_images))

    if year_reducer is None:
        year_reducer = ee.Reducer.mean()
    if region_reducer is None:
        region_reducer = ee.Reducer.mean()

    doy_images = group_by_doy(image_collection, start_day, end_day, year_reducer)

    if series_property is None:
        series_property = "system:index"
    regions = regions.select([series_property])
    fc = zonal_stats(
        doy_images.toBands(),
        regions,
        stat_type=region_reducer,
        scale=scale,
        verbose=False,
        return_fc=True,
    )
    df = ee_to_df(fc)
    df = transpose_df(df, label_col=series_property, index_name="doy")
    df["doy"] = df.index.str.split("_").str[0].astype(int)
    df.sort_values("doy", inplace=True)
    y_cols = df.columns.tolist()
    y_cols.remove("doy")

    fig = Chart(
        df,
        chart_type,
        "doy",
        y_cols,
        colors,
        title,
        x_label,
        y_label,
        **kwargs,
    )
    return fig

image_histogram(image, region, scale, max_buckets, min_bucket_width, max_raw, max_pixels, reducer_args={}, **kwargs)

Creates a histogram for each band of the specified image within the given region using bqplot.

Parameters:

Name Type Description Default
image ee.Image

The Earth Engine image for which to create histograms.

required
region ee.Geometry

The region over which to calculate the histograms.

required
scale int

The scale in meters of the calculation.

required
max_buckets int

The maximum number of buckets in the histogram.

required
min_bucket_width float

The minimum width of the buckets in the histogram.

required
max_raw int

The maximum number of pixels to include in the histogram.

required
max_pixels int

The maximum number of pixels to reduce.

required
reducer_args Dict[str, Any]

Additional arguments to pass to the image.reduceRegion.

{}

Keyword arguments:

Name Type Description
colors List[str]

Colors for the histograms of each band.

labels List[str]

Labels for the histograms of each band.

title str

Title of the combined histogram plot.

legend_location str

Location of the legend in the plot.

Returns:

Type Description
bq.Figure

The bqplot figure containing the histograms.

Source code in geemap/chart.py
def image_histogram(
    image: ee.Image,
    region: ee.Geometry,
    scale: int,
    max_buckets: int,
    min_bucket_width: float,
    max_raw: int,
    max_pixels: int,
    reducer_args: Dict[str, Any] = {},
    **kwargs: Dict[str, Any],
) -> bq.Figure:
    """
    Creates a histogram for each band of the specified image within the given
    region using bqplot.

    Args:
        image (ee.Image): The Earth Engine image for which to create histograms.
        region (ee.Geometry): The region over which to calculate the histograms.
        scale (int): The scale in meters of the calculation.
        max_buckets (int): The maximum number of buckets in the histogram.
        min_bucket_width (float): The minimum width of the buckets in the histogram.
        max_raw (int): The maximum number of pixels to include in the histogram.
        max_pixels (int): The maximum number of pixels to reduce.
        reducer_args (Dict[str, Any]): Additional arguments to pass to the image.reduceRegion.

    Keyword Args:
        colors (List[str]): Colors for the histograms of each band.
        labels (List[str]): Labels for the histograms of each band.
        title (str): Title of the combined histogram plot.
        legend_location (str): Location of the legend in the plot.

    Returns:
        bq.Figure: The bqplot figure containing the histograms.
    """
    # Calculate the histogram data.
    histogram = image.reduceRegion(
        reducer=ee.Reducer.histogram(
            maxBuckets=max_buckets, minBucketWidth=min_bucket_width, maxRaw=max_raw
        ),
        geometry=region,
        scale=scale,
        maxPixels=max_pixels,
        **reducer_args,
    )

    histograms = {
        band: histogram.get(band).getInfo() for band in image.bandNames().getInfo()
    }

    # Create bqplot histograms for each band.
    def create_histogram(
        hist_data: Dict[str, Any], color: str, label: str
    ) -> bq.Figure:
        """
        Creates a bqplot histogram for the given histogram data.

        Args:
            hist_data (dict): The histogram data.
            color (str): The color of the histogram.
            label (str): The label of the histogram.

        Returns:
            bq.Figure: The bqplot figure for the histogram.
        """
        x_data = np.array(hist_data["bucketMeans"])
        y_data = np.array(hist_data["histogram"])

        x_sc = bq.LinearScale()
        y_sc = bq.LinearScale()

        bar = bq.Bars(
            x=x_data,
            y=y_data,
            scales={"x": x_sc, "y": y_sc},
            colors=[color],
            display_legend=True,
            labels=[label],
        )

        ax_x = bq.Axis(scale=x_sc, label="Reflectance (x1e4)", tick_format="0.0f")
        ax_y = bq.Axis(
            scale=y_sc, orientation="vertical", label="Count", tick_format="0.0f"
        )

        return bq.Figure(marks=[bar], axes=[ax_x, ax_y])

    # Define colors and labels for the bands.
    band_colors = kwargs.get("colors", ["#cf513e", "#1d6b99", "#f0af07"])
    band_labels = kwargs.get("labels", image.bandNames().getInfo())

    # Create and combine histograms for each band.
    histograms_fig = []
    for band, color, label in zip(histograms.keys(), band_colors, band_labels):
        histograms_fig.append(create_histogram(histograms[band], color, label))

    combined_fig = bq.Figure(
        marks=[fig.marks[0] for fig in histograms_fig],
        axes=histograms_fig[0].axes,
        **kwargs,
    )

    for fig, label in zip(histograms_fig, band_labels):
        fig.marks[0].labels = [label]

    combined_fig.legend_location = kwargs.get("legend_location", "top-right")

    return combined_fig

image_regions(image, regions, reducer, scale, series_property, x_labels, **kwargs)

Generates a Chart from an image by regions. Extracts and plots band values in multiple regions.

Parameters:

Name Type Description Default
image ee.Image

Image to extract band values from.

required
regions Union[ee.FeatureCollection, ee.Geometry]

Regions to reduce. Defaults to the image's footprint.

required
reducer Union[str, ee.Reducer]

The reducer type for zonal statistics. Can be one of 'mean', 'median', 'sum', 'min', 'max', etc.

required
scale int

The scale in meters at which to perform the analysis.

required
series_property str

The property to use for labeling the series.

required
x_labels List[str]

List of x-axis labels.

required
**kwargs Any

Additional keyword arguments.

{}

Returns:

Type Description
bq.Figure

The bqplot figure.

Source code in geemap/chart.py
def image_regions(
    image: ee.Image,
    regions: Union[ee.FeatureCollection, ee.Geometry],
    reducer: Union[str, ee.Reducer],
    scale: int,
    series_property: str,
    x_labels: List[str],
    **kwargs: Any,
) -> None:
    """
    Generates a Chart from an image by regions. Extracts and plots band values
    in multiple regions.

    Args:
        image (ee.Image): Image to extract band values from.
        regions (Union[ee.FeatureCollection, ee.Geometry]): Regions to reduce.
            Defaults to the image's footprint.
        reducer (Union[str, ee.Reducer]): The reducer type for zonal statistics.
            Can be one of 'mean', 'median', 'sum', 'min', 'max', etc.
        scale (int): The scale in meters at which to perform the analysis.
        series_property (str): The property to use for labeling the series.
        x_labels (List[str]): List of x-axis labels.
        **kwargs: Additional keyword arguments.

    Returns:
        bq.Figure: The bqplot figure.
    """
    fc = zonal_stats(
        image, regions, stat_type=reducer, scale=scale, verbose=False, return_fc=True
    )
    bands = image.bandNames().getInfo()
    fc = fc.select(bands   [series_property])
    return feature_by_property(fc, x_labels, series_property, **kwargs)

image_series(image_collection, region, reducer=None, scale=None, x_property='system:time_start', chart_type='LineChart', x_cols=None, y_cols=None, colors=None, title=None, x_label=None, y_label=None, **kwargs)

Generates a time series chart of an image collection for a specific region.

Parameters:

Name Type Description Default
image_collection ee.ImageCollection

The image collection to analyze.

required
region Union[ee.Geometry, ee.FeatureCollection]

The region to reduce.

required
reducer Optional[Union[str, ee.Reducer]]

The reducer to use.

None
scale Optional[int]

The scale in meters at which to perform the analysis.

None
x_property str

The name of the property to use as the x-axis values.

'system:time_start'
chart_type str

The type of chart to create. Supported types are 'ScatterChart', 'LineChart', 'ColumnChart', 'BarChart', 'PieChart', 'AreaChart', and 'Table'.

'LineChart'
x_cols Optional[List[str]]

The columns to use for the x-axis. Defaults to the first column.

None
y_cols Optional[List[str]]

The columns to use for the y-axis. Defaults to the second column.

None
colors Optional[List[str]]

The colors to use for the chart. Defaults to a predefined list of colors.

None
title Optional[str]

The title of the chart. Defaults to the chart type.

None
x_label Optional[str]

The label for the x-axis. Defaults to an empty string.

None
y_label Optional[str]

The label for the y-axis. Defaults to an empty string.

None
**kwargs Any

Additional keyword arguments to pass to the bqplot Figure or mark objects. For axes_options, see https://bqplot.github.io/bqplot/api/axes

{}

Returns:

Type Description
Chart

The chart object.

Source code in geemap/chart.py
def image_series(
    image_collection: ee.ImageCollection,
    region: Union[ee.Geometry, ee.FeatureCollection],
    reducer: Optional[Union[str, ee.Reducer]] = None,
    scale: Optional[int] = None,
    x_property: str = "system:time_start",
    chart_type: str = "LineChart",
    x_cols: Optional[List[str]] = None,
    y_cols: Optional[List[str]] = None,
    colors: Optional[List[str]] = None,
    title: Optional[str] = None,
    x_label: Optional[str] = None,
    y_label: Optional[str] = None,
    **kwargs: Any,
) -> Chart:
    """
    Generates a time series chart of an image collection for a specific region.

    Args:
        image_collection (ee.ImageCollection): The image collection to analyze.
        region (Union[ee.Geometry, ee.FeatureCollection]): The region to reduce.
        reducer (Optional[Union[str, ee.Reducer]]): The reducer to use.
        scale (Optional[int]): The scale in meters at which to perform the analysis.
        x_property (str): The name of the property to use as the x-axis values.
        chart_type (str): The type of chart to create. Supported types are
            'ScatterChart', 'LineChart', 'ColumnChart', 'BarChart',
            'PieChart', 'AreaChart', and 'Table'.
        x_cols (Optional[List[str]]): The columns to use for the x-axis.
            Defaults to the first column.
        y_cols (Optional[List[str]]): The columns to use for the y-axis.
            Defaults to the second column.
        colors (Optional[List[str]]): The colors to use for the chart.
            Defaults to a predefined list of colors.
        title (Optional[str]): The title of the chart. Defaults to the
            chart type.
        x_label (Optional[str]): The label for the x-axis. Defaults to an
            empty string.
        y_label (Optional[str]): The label for the y-axis. Defaults to an
            empty string.
        **kwargs: Additional keyword arguments to pass to the bqplot Figure
            or mark objects. For axes_options, see
            https://bqplot.github.io/bqplot/api/axes

    Returns:
        Chart: The chart object.
    """

    if reducer is None:
        reducer = ee.Reducer.mean()

    band_names = image_collection.first().bandNames().getInfo()

    # Function to reduce the region and get the mean for each image.
    def get_stats(image):
        stats = image.reduceRegion(reducer=reducer, geometry=region, scale=scale)

        results = {}
        for band in band_names:
            results[band] = stats.get(band)

        if x_property == "system:time_start" or x_property == "system:time_end":
            results["date"] = image.date().format("YYYY-MM-dd")
        else:
            results[x_property] = image.get(x_property).getInfo()

        return ee.Feature(None, results)

    # Apply the function over the image collection.
    fc = ee.FeatureCollection(
        image_collection.map(get_stats).filter(ee.Filter.notNull(band_names))
    )
    df = ee_to_df(fc)
    if "date" in df.columns:
        df["date"] = pd.to_datetime(df["date"])

    fig = Chart(
        df,
        chart_type,
        x_cols,
        y_cols,
        colors,
        title,
        x_label,
        y_label,
        **kwargs,
    )
    return fig

image_series_by_region(image_collection, regions, reducer=None, band=None, scale=None, x_property='system:time_start', series_property='system:index', chart_type='LineChart', x_cols=None, y_cols=None, colors=None, title=None, x_label=None, y_label=None, **kwargs)

Generates a time series chart of an image collection for multiple regions.

Parameters:

Name Type Description Default
image_collection ee.ImageCollection

The image collection to analyze.

required
regions ee.FeatureCollection | ee.Geometry

The regions to reduce.

required
reducer str | ee.Reducer

The reducer type for zonal statistics.

None
band str

The name of the band to analyze.

None
scale int

The scale in meters at which to perform the analysis.

None
x_property str

The name of the property to use as the x-axis values.

'system:time_start'
series_property str

The property to use for labeling the series.

'system:index'
chart_type str

The type of chart to create. Supported types are 'ScatterChart', 'LineChart', 'ColumnChart', 'BarChart', 'PieChart', 'AreaChart', and 'Table'.

'LineChart'
x_cols Optional[List[str]]

The columns to use for the x-axis. Defaults to the first column.

None
y_cols Optional[List[str]]

The columns to use for the y-axis. Defaults to the second column.

None
colors Optional[List[str]]

The colors to use for the chart. Defaults to a predefined list of colors.

None
title Optional[str]

The title of the chart. Defaults to the chart type.

None
x_label Optional[str]

The label for the x-axis. Defaults to an empty string.

None
y_label Optional[str]

The label for the y-axis. Defaults to an empty string.

None
**kwargs Any

Additional keyword arguments to pass to the bqplot Figure or mark objects. For axes_options, see https://bqplot.github.io/bqplot/api/axes

{}

Returns:

Type Description
Chart

The chart object.

Source code in geemap/chart.py
def image_series_by_region(
    image_collection: ee.ImageCollection,
    regions: Union[ee.FeatureCollection, ee.Geometry],
    reducer: Optional[Union[str, ee.Reducer]] = None,
    band: Optional[str] = None,
    scale: Optional[int] = None,
    x_property: str = "system:time_start",
    series_property: str = "system:index",
    chart_type: str = "LineChart",
    x_cols: Optional[List[str]] = None,
    y_cols: Optional[List[str]] = None,
    colors: Optional[List[str]] = None,
    title: Optional[str] = None,
    x_label: Optional[str] = None,
    y_label: Optional[str] = None,
    **kwargs: Any,
) -> Chart:
    """
    Generates a time series chart of an image collection for multiple regions.

    Args:
        image_collection (ee.ImageCollection): The image collection to analyze.
        regions (ee.FeatureCollection | ee.Geometry): The regions to reduce.
        reducer (str | ee.Reducer): The reducer type for zonal statistics.
        band (str): The name of the band to analyze.
        scale (int): The scale in meters at which to perform the analysis.
        x_property (str): The name of the property to use as the x-axis values.
        series_property (str): The property to use for labeling the series.
        chart_type (str): The type of chart to create. Supported types are
            'ScatterChart', 'LineChart', 'ColumnChart', 'BarChart',
            'PieChart', 'AreaChart', and 'Table'.
        x_cols (Optional[List[str]]): The columns to use for the x-axis.
            Defaults to the first column.
        y_cols (Optional[List[str]]): The columns to use for the y-axis.
            Defaults to the second column.
        colors (Optional[List[str]]): The colors to use for the chart.
            Defaults to a predefined list of colors.
        title (Optional[str]): The title of the chart. Defaults to the
            chart type.
        x_label (Optional[str]): The label for the x-axis. Defaults to an
            empty string.
        y_label (Optional[str]): The label for the y-axis. Defaults to an
            empty string.
        **kwargs: Additional keyword arguments to pass to the bqplot Figure
            or mark objects. For axes_options, see
            https://bqplot.github.io/bqplot/api/axes

    Returns:
        Chart: The chart object.
    """
    if reducer is None:
        reducer = ee.Reducer.mean()

    if band is None:
        band = image_collection.first().bandNames().get(0).getInfo()

    image = image_collection.select(band).toBands()

    fc = zonal_stats(
        image, regions, stat_type=reducer, scale=scale, verbose=False, return_fc=True
    )
    columns = image.bandNames().getInfo()   [series_property]
    df = ee_to_df(fc, columns=columns)

    headers = df[series_property].tolist()
    df = df.drop(columns=[series_property]).T
    df.columns = headers

    if x_property == "system:time_start" or x_property == "system:time_end":
        indexes = image_dates(image_collection).getInfo()
        df["index"] = pd.to_datetime(indexes)

    else:
        indexes = image_collection.aggregate_array(x_property).getInfo()
        df["index"] = indexes

    fig = Chart(
        df,
        chart_type,
        x_cols,
        y_cols,
        colors,
        title,
        x_label,
        y_label,
        **kwargs,
    )
    return fig

pivot_df(df, index, columns, values)

Pivots a DataFrame using the specified index, columns, and values.

Parameters:

Name Type Description Default
df pd.DataFrame

The DataFrame to pivot.

required
index str

The column to use for the index.

required
columns str

The column to use for the columns.

required
values str

The column to use for the values.

required

Returns:

Type Description
pd.DataFrame

The pivoted DataFrame.

Source code in geemap/chart.py
def pivot_df(df: pd.DataFrame, index: str, columns: str, values: str) -> pd.DataFrame:
    """
    Pivots a DataFrame using the specified index, columns, and values.

    Args:
        df (pd.DataFrame): The DataFrame to pivot.
        index (str): The column to use for the index.
        columns (str): The column to use for the columns.
        values (str): The column to use for the values.

    Returns:
        pd.DataFrame: The pivoted DataFrame.
    """
    df_pivot = df.pivot(index=index, columns=columns, values=values).reset_index()
    df_pivot.columns = [index]   [f"{col}" for col in df_pivot.columns[1:]]
    return df_pivot

transpose_df(df, label_col, index_name=None, indexes=None)

Transposes a pandas DataFrame and optionally sets a new index name and custom indexes.

Parameters:

Name Type Description Default
df pd.DataFrame

The DataFrame to transpose.

required
label_col str

The column to set as the index before transposing.

required
index_name str

The name to set for the index after transposing. Defaults to None.

None
indexes list

A list of custom indexes to set after transposing. The length of this list must match the number of rows in the transposed DataFrame. Defaults to None.

None

Returns:

Type Description
pd.DataFrame

The transposed DataFrame.

Exceptions:

Type Description
ValueError

If label_col is not a column in the DataFrame.

ValueError

If the length of indexes does not match the number of rows in the transposed DataFrame.

Source code in geemap/chart.py
def transpose_df(
    df: pd.DataFrame,
    label_col: str,
    index_name: str = None,
    indexes: list = None,
) -> pd.DataFrame:
    """
    Transposes a pandas DataFrame and optionally sets a new index name and
        custom indexes.

    Args:
        df (pd.DataFrame): The DataFrame to transpose.
        label_col (str): The column to set as the index before transposing.
        index_name (str, optional): The name to set for the index after
            transposing. Defaults to None.
        indexes (list, optional): A list of custom indexes to set after
            transposing. The length of this list must match the number of rows
            in the transposed DataFrame. Defaults to None.

    Returns:
        pd.DataFrame: The transposed DataFrame.

    Raises:
        ValueError: If `label_col` is not a column in the DataFrame.
        ValueError: If the length of `indexes` does not match the number of
            rows in the transposed DataFrame.
    """
    # Check if the specified column exists in the DataFrame
    if label_col not in df.columns:
        raise ValueError(f"Column '{label_col}' not found in DataFrame")

    # Set the specified column as the index
    transposed_df = df.set_index(label_col).transpose()

    # Set the index name if provided
    if index_name:
        transposed_df.columns.name = index_name

    # Set custom indexes if provided
    if indexes:
        if len(indexes) != len(transposed_df.index):
            raise ValueError(
                "Length of custom indexes must match the number of rows in the transposed DataFrame"
            )
        transposed_df.index = indexes

    return transposed_df