diff --git a/sphinx/_generated/visualize/basic_charts/line_chart.html b/sphinx/_generated/visualize/basic_charts/line_chart.html new file mode 100644 index 000000000..4ccbcf175 --- /dev/null +++ b/sphinx/_generated/visualize/basic_charts/line_chart.html @@ -0,0 +1,14 @@ + + + +
+
+ + \ No newline at end of file diff --git a/sphinx/_generated/visualize/basic_charts/pie_chart.html b/sphinx/_generated/visualize/basic_charts/pie_chart.html new file mode 100644 index 000000000..196eade2e --- /dev/null +++ b/sphinx/_generated/visualize/basic_charts/pie_chart.html @@ -0,0 +1,14 @@ + + + +
+
+ + \ No newline at end of file diff --git a/sphinx/_generated/visualize/basic_charts/ranking_chart.html b/sphinx/_generated/visualize/basic_charts/ranking_chart.html new file mode 100644 index 000000000..f77e16062 --- /dev/null +++ b/sphinx/_generated/visualize/basic_charts/ranking_chart.html @@ -0,0 +1,14 @@ + + + +
+
+ + \ No newline at end of file diff --git a/sphinx/images/report/word_cloud.png b/sphinx/images/report/word_cloud.png deleted file mode 100644 index 3ae597a51..000000000 Binary files a/sphinx/images/report/word_cloud.png and /dev/null differ diff --git a/sphinx/images/visualize/basic_charts/word_cloud.png b/sphinx/images/visualize/basic_charts/word_cloud.png new file mode 100644 index 000000000..41124533a Binary files /dev/null and b/sphinx/images/visualize/basic_charts/word_cloud.png differ diff --git a/sphinx/visualize/basic_charts/__index__.rst b/sphinx/visualize/basic_charts/__index__.rst index 3b675f71c..8961fb165 100644 --- a/sphinx/visualize/basic_charts/__index__.rst +++ b/sphinx/visualize/basic_charts/__index__.rst @@ -4,14 +4,14 @@ Basic Charts .. toctree:: :hidden: - column_chart bar_chart - pie_chart + cleveland_dot_chart + column_chart line_chart + pie_chart + ranking_chart word_cloud world_map - cleveland_dot_chart - ranking_chart diff --git a/sphinx/visualize/basic_charts/line_chart.rst b/sphinx/visualize/basic_charts/line_chart.rst index f4de588e4..e44a240bb 100644 --- a/sphinx/visualize/basic_charts/line_chart.rst +++ b/sphinx/visualize/basic_charts/line_chart.rst @@ -1,3 +1,3 @@ -.. automodule:: techminer2.report.line_chart +.. automodule:: techminer2.visualize.basic_charts.line_chart :members: diff --git a/sphinx/visualize/basic_charts/pie_chart.rst b/sphinx/visualize/basic_charts/pie_chart.rst index a6edccd26..955a7f5b8 100644 --- a/sphinx/visualize/basic_charts/pie_chart.rst +++ b/sphinx/visualize/basic_charts/pie_chart.rst @@ -1,3 +1,3 @@ -.. automodule:: techminer2.report.pie_chart +.. automodule:: techminer2.visualize.basic_charts.pie_chart :members: diff --git a/sphinx/visualize/basic_charts/ranking_chart.rst b/sphinx/visualize/basic_charts/ranking_chart.rst index 02a7f2e9f..cfcb71ff8 100644 --- a/sphinx/visualize/basic_charts/ranking_chart.rst +++ b/sphinx/visualize/basic_charts/ranking_chart.rst @@ -1,3 +1,3 @@ -.. automodule:: techminer2.report.ranking_chart +.. automodule:: techminer2.visualize.basic_charts.ranking_chart :members: diff --git a/sphinx/visualize/basic_charts/word_cloud.rst b/sphinx/visualize/basic_charts/word_cloud.rst index 94f948ab0..1e10fb85c 100644 --- a/sphinx/visualize/basic_charts/word_cloud.rst +++ b/sphinx/visualize/basic_charts/word_cloud.rst @@ -1,3 +1,3 @@ -.. automodule:: techminer2.report.word_cloud +.. automodule:: techminer2.visualize.basic_charts.word_cloud :members: diff --git a/techminer2/visualize/basic_charts/line_chart.py b/techminer2/visualize/basic_charts/line_chart.py index 5c3d13212..6a905486d 100644 --- a/techminer2/visualize/basic_charts/line_chart.py +++ b/techminer2/visualize/basic_charts/line_chart.py @@ -9,38 +9,38 @@ Line Chart =============================================================================== ->>> from techminer2.report import line_chart ->>> plot = line_chart( -... # -... # ITEMS PARAMS: -... field='author_keywords', -... top_n=20, -... occ_range=(None, None), -... gc_range=(None, None), -... custom_terms=None, -... # -... metric="OCC", -... # -... # CHART PARAMS: -... title="Most Frequent Author Keywords", -... metric_label=None, -... field_label=None, -... # -... # DATABASE PARAMS: -... root_dir="example/", -... database="main", -... year_filter=(None, None), -... cited_by_filter=(None, None), +>>> from techminer2.visualize.basic_charts.line_chart import LineChart +>>> plot = ( +... LineChart() +... .set_item_params( +... field="author_keywords", +... top_n=20, +... occ_range=(None, None), +... gc_range=(None, None), +... custom_terms=None, +... ).set_chart_params( +... title_text="Most Frequent Author Keywords", +... metric_label=None, +... field_label=None, +... ).set_database_params( +... root_dir="example/", +... database="main", +... year_filter=(None, None), +... cited_by_filter=(None, None), +... ).build(metric="OCC") ... ) >>> # plot.write_html("sphinx/_generated/visualize/basic_charts/line_chart.html") .. raw:: html - """ +from dataclasses import dataclass +from typing import Optional + import plotly.express as px # type: ignore from ...internals.params.database_params import DatabaseParams, DatabaseParamsMixin @@ -50,102 +50,88 @@ MARKER_COLOR = "#7793a5" MARKER_LINE_COLOR = "#465c6b" + +@dataclass +class ChartParams: + """:meta private:""" + + title_text: Optional[str] = None + metric_label: Optional[str] = None + field_label: Optional[str] = None + + class LineChart( ItemParamsMixin, DatabaseParamsMixin, ): - """Line chart.""" + """:meta private:""" def __init__(self): + self.chart_params = ChartParams() self.database_params = DatabaseParams() self.item_params = ItemParams() - def build(self, metric: str = "OCC"): - - + def set_chart_params(self, **kwars): + for key, value in kwars.items(): + if hasattr(self.chart_params, key): + setattr(self.chart_params, key, value) + else: + raise ValueError(f"Invalid parameter for ChartParams: {key}") + return self -def line_chart( - # - # ITEMS PARAMS: - field, - top_n=None, - occ_range=(None, None), - gc_range=(None, None), - custom_terms=None, - # - metric="OCC", - # - # CHART PARAMS: - title=None, - field_label=None, - metric_label=None, - # - # DATABASE PARAMS: - root_dir="./", - database="main", - year_filter=(None, None), - cited_by_filter=(None, None), - **filters, -): - """:meta private:""" + def build(self, metric: str = "OCC"): - items = performance_metrics_frame( - # - # ITEMS PARAMS: - field=field, - top_n=top_n, - occ_range=occ_range, - gc_range=gc_range, - custom_terms=custom_terms, - # - metric=metric, - # - # DATABASE PARAMS: - root_dir=root_dir, - database=database, - year_filter=year_filter, - cited_by_filter=cited_by_filter, - **filters, - ) - - metric_label = metric.replace("_", " ").upper() if metric_label is None else metric_label - - field_label = field.replace("_", " ").upper() if field_label is None else field_label - - data_frame = items.copy() - - fig = px.line( - data_frame, - x=None, - y=metric, - hover_data=data_frame.columns.to_list(), - markers=True, - ) - - fig.update_layout( - paper_bgcolor="white", - plot_bgcolor="white", - title_text=title, - ) - fig.update_traces( - marker=dict(size=9, line={"color": "#465c6b", "width": 2}), - marker_color=MARKER_COLOR, - line={"color": MARKER_LINE_COLOR}, - ) - fig.update_xaxes( - linecolor="gray", - linewidth=2, - gridcolor="lightgray", - griddash="dot", - tickangle=270, - title_text=field_label, - ) - fig.update_yaxes( - linecolor="gray", - linewidth=2, - gridcolor="lightgray", - griddash="dot", - title_text=metric_label, - ) - - return fig + metric_label = self.chart_params.metric_label + field_label = self.chart_params.field_label + title_text = self.chart_params.title_text + + data_frame = performance_metrics_frame( + metric=metric, + **self.item_params.__dict__, + **self.database_params.__dict__, + ) + + if metric_label is None: + metric_label = metric.replace("_", " ").upper() + + if field_label is None: + field_label = self.item_params.field.replace("_", " ").upper() + + if title_text is None: + title_text = "" + + fig = px.line( + data_frame, + x=None, + y=metric, + hover_data=data_frame.columns.to_list(), + markers=True, + ) + + fig.update_layout( + paper_bgcolor="white", + plot_bgcolor="white", + title_text=title_text, + ) + fig.update_traces( + marker=dict(size=9, line={"color": "#465c6b", "width": 2}), + marker_color=MARKER_COLOR, + line={"color": MARKER_LINE_COLOR}, + ) + fig.update_xaxes( + linecolor="gray", + linewidth=2, + gridcolor="lightgray", + griddash="dot", + tickangle=270, + title_text=field_label, + ) + fig.update_yaxes( + linecolor="gray", + linewidth=2, + gridcolor="lightgray", + griddash="dot", + title_text=metric_label, + ) + + return fig diff --git a/techminer2/visualize/basic_charts/pie_chart.py b/techminer2/visualize/basic_charts/pie_chart.py index 0a0540d56..d2cff7c96 100644 --- a/techminer2/visualize/basic_charts/pie_chart.py +++ b/techminer2/visualize/basic_charts/pie_chart.py @@ -9,37 +9,39 @@ Pie Chart =============================================================================== ->>> from techminer2.report import pie_chart ->>> plot = pie_chart( -... # -... # TERM PARAMS: -... field='author_keywords', -... top_n=20, -... occ_range=(None, None), -... gc_range=(None, None), -... custom_terms=None, -... metric="OCC", -... # -... # CHART PARAMS: -... title="Most Frequent Author Keywords", -... hole=0.4, -... # -... # DATABASE PARAMS: -... root_dir="example/", -... database="main", -... year_filter=(None, None), -... cited_by_filter=(None, None), + +>>> from techminer2.visualize.basic_charts.pie_chart import PieChart +>>> plot = ( +... PieChart() +... .set_item_params( +... field="author_keywords", +... top_n=20, +... occ_range=(None, None), +... gc_range=(None, None), +... custom_terms=None, +... ).set_chart_params( +... title_text="Most Frequent Author Keywords", +... hole=0.4, +... ).set_database_params( +... root_dir="example/", +... database="main", +... year_filter=(None, None), +... cited_by_filter=(None, None), +... ).build(metric="OCC") ... ) ->>> # plot.write_html("sphinx/_generated/visualize/basic_charts/pie_chart.html") +>>> plot.write_html("sphinx/_generated/visualize/basic_charts/pie_chart.html") .. raw:: html - - + """ +from dataclasses import dataclass +from typing import Optional + import plotly.express as px # type: ignore from ...internals.params.database_params import DatabaseParams, DatabaseParamsMixin @@ -47,74 +49,53 @@ from ...metrics.performance_metrics_frame import performance_metrics_frame +@dataclass +class ChartParams: + """:meta private:""" + + title_text: Optional[str] = None + hole: Optional[float] = 0.4 + class PieChart( ItemParamsMixin, DatabaseParamsMixin, ): - """Pie Chart.""" + """:meta private:""" def __init__(self): + self.chart_params = ChartParams() self.database_params = DatabaseParams() self.item_params = ItemParams() - def build(self, metric: str = "OCC"): - + def set_chart_params(self, **kwars): + for key, value in kwars.items(): + if hasattr(self.chart_params, key): + setattr(self.chart_params, key, value) + else: + raise ValueError(f"Invalid parameter for ChartParams: {key}") + return self -def pie_chart( - # - # ITEMS PARAMS: - field, - top_n=None, - occ_range=(None, None), - gc_range=(None, None), - custom_terms=None, - metric="OCC", - # - # CHART PARAMS: - title=None, - hole=0.4, - # - # DATABASE PARAMS: - root_dir="./", - database="main", - year_filter=(None, None), - cited_by_filter=(None, None), - **filters, -): - """:meta private:""" + def build(self, metric: str = "OCC"): - items = performance_metrics_frame( - # - # ITEMS PARAMS: - field=field, - metric=metric, - # - # ITEM FILTERS: - top_n=top_n, - occ_range=occ_range, - gc_range=gc_range, - custom_terms=custom_terms, - # - # DATABASE PARAMS: - root_dir=root_dir, - database=database, - year_filter=year_filter, - cited_by_filter=cited_by_filter, - **filters, - ) - - data_frame = items.copy() - - fig = px.pie( - data_frame, - values=metric, - names=data_frame.index.to_list(), - hole=hole, - hover_data=data_frame.columns.to_list(), - title=title if title is not None else "", - ) - fig.update_traces(textinfo="percent+value") - fig.update_layout(legend={"y": 0.5}) - - return fig + title_text = self.chart_params.title_text + hole = self.chart_params.hole + + data_frame = performance_metrics_frame( + metric=metric, + **self.item_params.__dict__, + **self.database_params.__dict__, + ) + + fig = px.pie( + data_frame, + values=metric, + names=data_frame.index.to_list(), + hole=hole, + hover_data=data_frame.columns.to_list(), + title=title_text, + ) + fig.update_traces(textinfo="percent+value") + fig.update_layout(legend={"y": 0.5}) + + return fig diff --git a/techminer2/visualize/basic_charts/ranking_chart.py b/techminer2/visualize/basic_charts/ranking_chart.py index 604e02970..2401f7949 100644 --- a/techminer2/visualize/basic_charts/ranking_chart.py +++ b/techminer2/visualize/basic_charts/ranking_chart.py @@ -9,44 +9,48 @@ Ranking Chart =============================================================================== ->>> from techminer2.report import ranking_chart ->>> plot = ranking_chart( -... # -... # ITEMS PARAMS: -... field='author_keywords', -... top_n=20, -... occ_range=(None, None), -... gc_range=(None, None), -... custom_terms=None, -... # -... metric="OCC", -... # -... # CHART PARAMS: -... title="Most Frequent Author Keywords", -... field_label=None, -... metric_label=None, -... textfont_size=10, -... marker_size=7, -... line_width=1.5, -... yshift=4, -... # -... # DATABASE PARAMS: -... root_dir="example/", -... database="main", -... year_filter=(None, None), -... cited_by_filter=(None, None), + +>>> from techminer2.visualize.basic_charts.ranking_chart import RankingChart +>>> plot = ( +... RankingChart() +... .set_item_params( +... field="author_keywords", +... top_n=20, +... occ_range=(None, None), +... gc_range=(None, None), +... custom_terms=None, +... ).set_chart_params( +... title_text="Most Frequent Author Keywords", +... metric_label=None, +... field_label=None, +... textfont_size=10, +... marker_size=7, +... line_width=1.5, +... yshift=4, +... ).set_database_params( +... root_dir="example/", +... database="main", +... year_filter=(None, None), +... cited_by_filter=(None, None), +... ).build(metric="OCC") ... ) >>> # plot.write_html("sphinx/_generated/visualize/basic_charts/ranking_chart.html") .. raw:: html - + + """ +from dataclasses import dataclass +from typing import Optional + import plotly.express as px # type: ignore + from ...internals.params.database_params import DatabaseParams, DatabaseParamsMixin from ...internals.params.item_params import ItemParams, ItemParamsMixin from ...metrics.performance_metrics_frame import performance_metrics_frame @@ -55,127 +59,112 @@ MARKER_LINE_COLOR = "#465c6b" +@dataclass +class ChartParams: + """:meta private:""" + + title_text: Optional[str] = None + metric_label: Optional[str] = None + field_label: Optional[str] = None + textfont_size: float = 10 + marker_size: float = 7 + line_width: float = 1.5 + yshift: float = 4 + + class RankingChart( ItemParamsMixin, DatabaseParamsMixin, ): - """Bar Chart.""" + """:meta private:""" def __init__(self): + self.chart_params = ChartParams() self.database_params = DatabaseParams() self.item_params = ItemParams() + def set_chart_params(self, **kwars): + for key, value in kwars.items(): + if hasattr(self.chart_params, key): + setattr(self.chart_params, key, value) + else: + raise ValueError(f"Invalid parameter for ChartParams: {key}") + return self + def build(self, metric: str = "OCC"): + metric_label = self.chart_params.metric_label + field_label = self.chart_params.field_label + title_text = self.chart_params.title_text + textfont_size = self.chart_params.textfont_size + marker_size = self.chart_params.marker_size + line_width = self.chart_params.line_width + yshift = self.chart_params.yshift + + data_frame = performance_metrics_frame( + metric=metric, + **self.item_params.__dict__, + **self.database_params.__dict__, + ) + + table = data_frame.copy() + table["Rank"] = list(range(1, len(table) + 1)) -def ranking_chart( - # - # ITEMS PARAMS: - field, - top_n=None, - occ_range=(None, None), - gc_range=(None, None), - custom_terms=None, - # - metric="OCC", - # - # CHART PARAMS: - title=None, - field_label=None, - metric_label=None, - textfont_size=10, - marker_size=7, - line_width=1.5, - yshift=4, - # - # ITEM FILTERS: - # - # DATABASE PARAMS: - root_dir="./", - database="main", - year_filter=(None, None), - cited_by_filter=(None, None), - **filters, -): - """Creates a rank chart. - - :meta private: - """ - - items = performance_metrics_frame( - # - # ITEMS PARAMS: - field=field, - metric=metric, - # - # ITEM FILTERS: - top_n=top_n, - occ_range=occ_range, - gc_range=gc_range, - custom_terms=custom_terms, - # - # DATABASE PARAMS: - root_dir=root_dir, - database=database, - year_filter=year_filter, - cited_by_filter=cited_by_filter, - **filters, - ) - - metric_label = metric.replace("_", " ").upper() if metric_label is None else metric_label - - field_label = field.replace("_", " ").upper() + " RANKING" if field_label is None else field_label - - data_frame = items.copy() - table = data_frame.copy() - table["Rank"] = list(range(1, len(table) + 1)) - - fig = px.line( - table, - x="Rank", - y=metric, - hover_data=data_frame.columns.to_list(), - markers=True, - ) - - fig.update_traces( - marker={ - "size": marker_size, - "line": {"color": MARKER_LINE_COLOR, "width": 1}, - }, - marker_color=MARKER_COLOR, - line={"color": MARKER_LINE_COLOR, "width": line_width}, - ) - fig.update_layout( - paper_bgcolor="white", - plot_bgcolor="white", - title_text=title if title is not None else "", - ) - fig.update_yaxes( - linecolor="gray", - linewidth=1, - gridcolor="lightgray", - griddash="dot", - title=metric_label, - ) - fig.update_xaxes( - linecolor="gray", - linewidth=1, - gridcolor="lightgray", - griddash="dot", - title=field_label, - ) - - for name, row in table.iterrows(): - fig.add_annotation( - x=row["Rank"], - y=row[metric], - text=name, - showarrow=False, - textangle=-90, - yanchor="bottom", - font={"size": textfont_size}, - yshift=yshift, + if metric_label is None: + metric_label = metric.replace("_", " ").upper() + + if field_label is None: + field_label = self.item_params.field.replace("_", " ").upper() + + if title_text is None: + title_text = "" + + fig = px.line( + table, + x="Rank", + y=metric, + hover_data=data_frame.columns.to_list(), + markers=True, + ) + + fig.update_traces( + marker={ + "size": marker_size, + "line": {"color": MARKER_LINE_COLOR, "width": 1}, + }, + marker_color=MARKER_COLOR, + line={"color": MARKER_LINE_COLOR, "width": line_width}, + ) + fig.update_layout( + paper_bgcolor="white", + plot_bgcolor="white", + title_text=title_text, + ) + fig.update_yaxes( + linecolor="gray", + linewidth=1, + gridcolor="lightgray", + griddash="dot", + title=metric_label, + ) + fig.update_xaxes( + linecolor="gray", + linewidth=1, + gridcolor="lightgray", + griddash="dot", + title=field_label, ) - return fig + for name, row in table.iterrows(): + fig.add_annotation( + x=row["Rank"], + y=row[metric], + text=name, + showarrow=False, + textangle=-90, + yanchor="bottom", + font={"size": textfont_size}, + yshift=yshift, + ) + + return fig diff --git a/techminer2/visualize/basic_charts/word_cloud.py b/techminer2/visualize/basic_charts/word_cloud.py index 9c77fcee8..eb635d159 100644 --- a/techminer2/visualize/basic_charts/word_cloud.py +++ b/techminer2/visualize/basic_charts/word_cloud.py @@ -9,127 +9,101 @@ Word Cloud =============================================================================== ->>> from techminer2.report import word_cloud ->>> chart = word_cloud( -... # -... # PERFORMANCE PARAMS: -... field="title_nlp_phrases", -... metric="OCC", -... # -... # CHART PARAMS: -... width=400, -... height=400, -... # -... # ITEM FILTERS: -... top_n=50, -... occ_range=(None, None), -... gc_range=(None, None), -... custom_terms=None, -... # -... # DATABASE PARAMS: -... root_dir="example/", -... database="main", -... year_filter=(None, None), -... cited_by_filter=(None, None), +>>> from techminer2.visualize.basic_charts.word_cloud import WordCloud +>>> plot = ( +... WordCloud() +... .set_item_params( +... field="title_nlp_phrases", +... top_n=80, +... occ_range=(None, None), +... gc_range=(None, None), +... custom_terms=None, +... ).set_chart_params( +... width=400, +... height=400, +... ).set_database_params( +... root_dir="example/", +... database="main", +... year_filter=(None, None), +... cited_by_filter=(None, None), +... ).build(metric="OCC") ... ) ->>> # chart.save("sphinx/images/report/word_cloud.png") +>>> # plot.save("sphinx/images/visualize/basic_charts/word_cloud.png") -.. image:: /images/report/word_cloud.png +.. image:: /images/visualize/basic_charts/word_cloud.png :width: 900px :align: center """ - +from dataclasses import dataclass import numpy as np -from wordcloud import WordCloud as WordCloudExternal +from wordcloud import WordCloud as WordCloudExternal # type: ignore from ...internals.params.database_params import DatabaseParams, DatabaseParamsMixin from ...internals.params.item_params import ItemParams, ItemParamsMixin from ...metrics.performance_metrics_frame import performance_metrics_frame +@dataclass +class ChartParams: + """:meta private:""" + + width: float = 400 + height: float = 400 + + class WordCloud( ItemParamsMixin, DatabaseParamsMixin, ): - """Bar Chart.""" + """:meta private:""" def __init__(self): + self.chart_params = ChartParams() self.database_params = DatabaseParams() self.item_params = ItemParams() + def set_chart_params(self, **kwars): + for key, value in kwars.items(): + if hasattr(self.chart_params, key): + setattr(self.chart_params, key, value) + else: + raise ValueError(f"Invalid parameter for ChartParams: {key}") + return self + def build(self, metric: str = "OCC"): + width = self.chart_params.width + height = self.chart_params.height -def word_cloud( - # - # ITEMS PARAMS: - field, - metric="OCC", - # - # CHART PARAMS: - width=400, - height=400, - # - # ITEM FILTERS: - top_n=None, - occ_range=(None, None), - gc_range=(None, None), - custom_terms=None, - # - # DATABASE PARAMS: - root_dir="./", - database="main", - year_filter=(None, None), - cited_by_filter=(None, None), - **filters, -): - """:meta private:""" + data_frame = performance_metrics_frame( + metric=metric, + **self.item_params.__dict__, + **self.database_params.__dict__, + ) + + x_mask, y_mask = np.ogrid[:300, :300] + mask = (x_mask - 150) ** 2 + (y_mask - 150) ** 2 > 130**2 #  type: ignore + mask = 255 * mask.astype(int) #  type: ignore + + wordcloud = WordCloudExternal( + background_color="white", + repeat=True, + mask=mask, + width=width, + height=height, + ) - items = performance_metrics_frame( - # - # ITEMS PARAMS: - field=field, - metric=metric, - # - # ITEM FILTERS: - top_n=top_n, - occ_range=occ_range, - gc_range=gc_range, - custom_terms=custom_terms, - # - # DATABASE PARAMS: - root_dir=root_dir, - database=database, - year_filter=year_filter, - cited_by_filter=cited_by_filter, - **filters, - ) - - data_frame = items.copy() - - x_mask, y_mask = np.ogrid[:300, :300] - mask = (x_mask - 150) ** 2 + (y_mask - 150) ** 2 > 130**2 - mask = 255 * mask.astype(int) - - wordcloud = WordCloud( - background_color="white", - repeat=True, - mask=mask, - width=width, - height=height, - ) - - text = dict( - zip( - data_frame.index, - data_frame[metric], + text = dict( + zip( + data_frame.index, + data_frame[metric], + ) ) - ) - wordcloud.generate_from_frequencies(text) - wordcloud.recolor(color_func=lambda word, **kwargs: "black") + wordcloud.generate_from_frequencies(text) + wordcloud.recolor(color_func=lambda word, **kwargs: "black") - fig = wordcloud.to_image() + fig = wordcloud.to_image() - return fig + return fig