Consejos de Python: resuelva el problema de los caracteres chinos confusos al usar matplotlib para generar imágenes (incluidos sistemas Windows y sistemas que no son Windows)

Ayer mismo, mis colegas del equipo de la plataforma sentados frente a mí estaban discutiendo confusamente con mis colegas de front-end los problemas encontrados durante el proceso de depuración conjunta. La situación general era la siguiente: los colegas de back-end necesitaban generar una imagen del reportar datos y luego enviarlos al front-end para su visualización. Parece un requisito que no es demasiado problemático y bastante simple, pero lo han estado discutiendo durante 2 días y todavía no lo han resuelto. Siempre han pensado que Puede ser un problema con la codificación de los datos de imagen transmitidos por el front-end y el front-end. Intentaron codificar los datos, decodificar el front-end y todavía hay problemas con algunos otros métodos. Nunca han podido. Para descubrir por qué la depuración conjunta local no muestra ningún problema, pero cuando se coloca en el servidor, ¿hay un problema confuso en chino?

Cuando lo entendí, sonreí y dije: Me he encontrado con este problema en mi larga carrera como codificador, jaja, echemos un vistazo a este problema juntos.

  • Primero, en Windows usamos el siguiente código para generar imágenes

import matplotlib.pyplot as plt fig = plt.figure(figsize=(5, 5))  # 定义图并设置画板尺寸fig.set(alpha=0.2)ax1 = fig.add_subplot(111)plt.title('测试图')plt.xlabel('x标签')plt.ylabel('y标签')plt.savefig('test.png')

Los caracteres chinos en la parte roja se reemplazan por cuadrados. Esto se debe a que la biblioteca de fuentes que viene con matplotlib no admite chino. Aquí, agregue las siguientes dos líneas de código para llamar al archivo simhei.ttf de fuente china del sistema. Por supuesto, También puede usar la fuente china que desee, siempre y cuando simplemente la coloque en la posición correcta. Hay otra manera sin agregar código. Debe descargar la fuente china > colocarla en la ruta de la biblioteca de fuentes matplotlib > modificar el archivo matplotlibrc. El efecto también se puede conseguir utilizando la primera solución a continuación.

import matplotlib.pyplot as pltplt.rcParams["font.sans-serif"] = ["SimHei"]  # 设置字体plt.rcParams["axes.unicode_minus"] = False  # 该语句解决图像中的“-”负号的乱码问题fig = plt.figure(figsize=(5, 5))  # 定义图并设置画板尺寸fig.set(alpha=0.2)ax1 = fig.add_subplot(111)plt.title('测试图')plt.xlabel('x标签')plt.ylabel('y标签')plt.savefig('test.png')

La visualización china es normal.

  • Echemos un vistazo a los sistemas que no son Windows, aquí se utiliza el servidor CentOS.

Utilice el código anterior para mostrar sin problemas en chino en el sistema Windows, los resultados son los siguientes

El chino sigue en cuadrados y el código también tiene una advertencia.

Puede saber por la advertencia que el sistema centos no tiene esta fuente china.

Solución

1. Busque el archivo de fuente "SimHei" en el directorio C:\Windows\Fonts de Windows. El nombre que se muestra es "Heilongjiang Regular".

2. Copie el archivo C:\Windows\Fonts\simhei.ttf anterior al directorio /usr/share/fonts/ del servidor centos.

3. Borre el caché de matplotlib y ejecute el comando rm -rf ~/.cache/matplotlib.

4. Ejecute el código nuevamente y el resultado es el siguiente, solución perfecta

Por supuesto, también puedes usar las fuentes que quieras. También puedes descargar fuentes que no tienes, simplemente colócalas en el directorio de arriba y podrás usarlas.

Para ser más detallado, si la aplicación se implementa en un contenedor, aquí hay una breve introducción a la solución. Debe incluir el archivo de fuente en el archivo del proyecto. En el archivo de imagen del contenedor, use el comando para copiar el archivo de fuente a el directorio contenedor /usr/share/fonts/., simplemente agregue estas dos instrucciones.

Eso es todo por compartir. Mi colega resolvió con éxito el problema. Espero que pueda ayudar a todos. Espero verlo la próxima vez. Hasta pronto.

Supongo que te gusta

Origin blog.csdn.net/qq_21372359/article/details/127110565
Recomendado
Clasificación