diff --git a/pyproject.toml b/pyproject.toml index b17954c96..a305181c3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -43,6 +43,7 @@ dependencies = [ "scipy>=1.8, <1.17", "pandas>1.5, <3.0, !=1.4.0", "matplotlib>=3.5, <=3.10", + "japanize-matplotlib", "pydantic>=2, <3", "PyYAML>=6.0.3, <6.1", "jinja2>=3.1.6, <3.2", diff --git a/src/data_profiling/__init__.py b/src/data_profiling/__init__.py index e5e2886d4..58e99f895 100644 --- a/src/data_profiling/__init__.py +++ b/src/data_profiling/__init__.py @@ -4,6 +4,7 @@ """ # ignore numba warnings import warnings # isort:skip # noqa +import japanize_matplotlib import importlib.util # isort:skip # noqa from warnings import warn diff --git a/src/data_profiling/visualisation/context.py b/src/data_profiling/visualisation/context.py index bb7228e2c..66fee344c 100644 --- a/src/data_profiling/visualisation/context.py +++ b/src/data_profiling/visualisation/context.py @@ -37,6 +37,12 @@ def manage_matplotlib_context() -> Any: "image.cmap": "Greys", "font.family": ["sans-serif"], "font.sans-serif": [ + "IPAexGothic", + "Meiryo", + "Hiragino Sans", + "Hiragino Kaku Gothic ProN", + "Noto Sans CJK JP", + "IPAGothic", "Arial", "Liberation Sans", "Bitstream Vera Sans", @@ -75,8 +81,8 @@ def manage_matplotlib_context() -> Any: try: register_matplotlib_converters() - matplotlib.rcParams.update(customRcParams) sns.set_style(style="white") + matplotlib.rcParams.update(customRcParams) yield finally: deregister_matplotlib_converters() # revert to original unit registries diff --git a/src/data_profiling/visualisation/plot.py b/src/data_profiling/visualisation/plot.py index 6f90977e9..2c5c90b84 100644 --- a/src/data_profiling/visualisation/plot.py +++ b/src/data_profiling/visualisation/plot.py @@ -10,6 +10,7 @@ from matplotlib.collections import PolyCollection from matplotlib.colors import Colormap, LinearSegmentedColormap, ListedColormap, rgb2hex from matplotlib.dates import AutoDateLocator, ConciseDateFormatter +from matplotlib.font_manager import findfont, FontProperties from matplotlib.patches import Patch from matplotlib.ticker import FuncFormatter, MaxNLocator from statsmodels.graphics.tsaplots import plot_acf, plot_pacf @@ -22,6 +23,15 @@ from data_profiling.visualisation.utils import plot_360_n0sc0pe +def _resolve_font_path() -> Optional[str]: + """Return the file path of the current matplotlib sans-serif font.""" + try: + fp = FontProperties() + return findfont(fp) + except Exception: + return None + + def format_fn(tick_val: int, tick_pos: Any) -> str: return convert_timestamp_to_datetime(tick_val).strftime("%Y-%m-%d %H:%M:%S") @@ -36,8 +46,9 @@ def _plot_word_cloud( plot = plt.figure(figsize=figsize) for i, series_data in enumerate(series): word_dict = series_data.to_dict() + font_path = config.plot.font_path or _resolve_font_path() wordcloud = WordCloud( - font_path=config.plot.font_path, + font_path=font_path, background_color="white", random_state=123, width=300,