Ver código fonte

fix: charts encoding (#2848)

Yeuoly 1 ano atrás
pai
commit
cef16862da
1 arquivos alterados com 33 adições e 0 exclusões
  1. 33 0
      api/core/tools/provider/builtin/chart/chart.py

+ 33 - 0
api/core/tools/provider/builtin/chart/chart.py

@@ -1,4 +1,6 @@
 import matplotlib.pyplot as plt
+from fontTools.ttLib import TTFont
+from matplotlib.font_manager import findSystemFonts
 
 from core.tools.errors import ToolProviderCredentialValidationError
 from core.tools.provider.builtin.chart.tools.line import LinearChartTool
@@ -6,6 +8,37 @@ from core.tools.provider.builtin_tool_provider import BuiltinToolProviderControl
 
 # use a business theme
 plt.style.use('seaborn-v0_8-darkgrid')
+plt.rcParams['axes.unicode_minus'] = False
+
+def init_fonts():
+    fonts = findSystemFonts()
+
+    popular_unicode_fonts = [
+        'Arial Unicode MS', 'DejaVu Sans', 'DejaVu Sans Mono', 'DejaVu Serif', 'FreeMono', 'FreeSans', 'FreeSerif',
+        'Liberation Mono', 'Liberation Sans', 'Liberation Serif', 'Noto Mono', 'Noto Sans', 'Noto Serif', 'Open Sans',
+        'Roboto', 'Source Code Pro', 'Source Sans Pro', 'Source Serif Pro', 'Ubuntu', 'Ubuntu Mono'
+    ]
+
+    supported_fonts = []
+
+    for font_path in fonts:
+        try:
+            font = TTFont(font_path)
+            # get family name
+            family_name = font['name'].getName(1, 3, 1).toUnicode()
+            if family_name in popular_unicode_fonts:
+                supported_fonts.append(family_name)
+        except:
+            pass
+
+    plt.rcParams['font.family'] = 'sans-serif'
+    # sort by order of popular_unicode_fonts
+    for font in popular_unicode_fonts:
+        if font in supported_fonts:
+            plt.rcParams['font.sans-serif'] = font
+            break
+    
+init_fonts()
 
 class ChartProvider(BuiltinToolProviderController):
     def _validate_credentials(self, credentials: dict) -> None: