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