关于mac系统下Jupyter notebook中seaborn显示中文变方框问题的解决办法

本文详细介绍了如何在Anaconda环境下配置matplotlib以正确显示中文字符,包括下载并安装SimHei字体,修改matplotlibrc文件,以及清理缓存文件,确保中文在Jupyter中正常显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一步:下载simhei.ttf字体并安装。

       下载链接:https://pan.baidu.com/s/1OOU01VMBPp2T4obaOno3rQ 提取码:kpp4 
       把下载好的字体文件复制到这个文件夹里

       /Users/你自己的用户名/anaconda3/lib/python3.6/site-packages/matplotlib/mpl-data/fonts/ttf


第二步:修改matplotlibrc文件内容


       matplotlibrc文件位置在:

       /Users/你自己的用户名/anaconda3/lib/python3.6/site-packages/matplotlib/mpl-data/matplotlibrc 

       打开文件后执行以下3个操作:

   (1) 找到font.family开头这一行,把前面的#去掉

        改完的结果是:font.family : sans-serif

   (2) 找到font.sans-serif开头这一行,把前面的#去掉,然后在font.sans-serif:后面新增SimHei

         改完结果是:font.sans-serif: SimHei, DejaVu Sans, Bitstream Vera Sans, Lucida Grande,
         Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif

   (3) 最后找到axes.unicode_minus这一行,将True改为False,作用就是解决负号'-'显示为方块的问题。


         改完结果是:axes.unicode_minus : False


第三步:删除tex.cache和fontList.json这两个文件


       同时按(Shift+Command+G)会出来一个对话框,输入如下文件路径:

       /Users/你自己的用户名/.matplotlib

       会出来一个文件夹,把里面的tex.cache文件夹和fontList.json文件删除掉


最后,重启anaconda jupyter,再运行代码就可以显示中文了
 

<think>问题:生成的趋势图上有文字显示成了方框怎么办?原因:这通常是因为matplotlib在渲染中文字符时缺少中文字体支持。解决方案:1.设置matplotlib使用支持中文的字体(如SimHei、Microsoft YaHei等)2.或者使用系统内置的中文字体以下是具体的解决方法:方法一:在代码中设置字体属性在绘图之前,添加以下代码:```pythonimport matplotlib.pyplot aspltplt.rcParams['font.sans-serif']= ['SimHei']#用来正常显示中文标签plt.rcParams['axes.unicode_minus']= False#用来正常显示负号```方法二:使用系统字体(更通用)如果方法一无效,可以尝试查找系统中已安装的中文字体,并指定使用。例如: ```pythonfrom matplotlib.font_managerimport FontPropertiesfont =FontProperties(fname='/path/to/font.ttf')#指定字体文件路径#然后在绘图时指定字体:plt.title('标题',fontproperties=font) plt.xlabel('x轴', fontproperties=font)plt.ylabel('y轴',fontproperties=font) #注意:这种方法需要在每个文本设置中单独指定```方法三:使用matplotlib的字体管理器动态添加字体(适用于已知字体文件) ```pythonimport matplotlib.font_manageras fm#添加中文字体font_path= '/path/to/your/font.ttf'#例如:'C:/Windows/Fonts/simhei.ttf' font_prop= fm.FontProperties(fname=font_path)#然后设置全局字体plt.rcParams['font.family']= font_prop.get_name() ```注意:在Windows系统中,常见中文字体路径为:-黑体:`C:/Windows/Fonts/simhei.ttf`-微软雅黑:`C:/Windows/Fonts/msyh.ttc`在Linux系统中,可能需要先安装中文字体,如:```bashsudo apt-get installfonts-wqy-microhei#文泉驿微米黑```然后使用路径:`/usr/share/fonts/truetype/wqy/wqy-microhei.ttc`在Mac系统中,字体路径通常为:`/System/Library/Fonts/PingFang.ttc`(苹方字体)方法四:使用seaborn设置(如果同时使用seaborn)注意:seaborn基于matplotlib,同样需要设置字体。在导入seaborn后设置字体: ```pythonimport seaborn assnssns.set(font='SimHei')#设置seaborn的字体```如果问题仍然存在,可以尝试以下步骤:1.确认字体文件路径是否正确2.重启内核(如果使用Jupyter Notebook)3.清除matplotlib的缓存:`matplotlib.get_cachedir()`返回的目录,删除该目录修改后的代码示例(在plot_trends方法中添加字体设置):在类中的plot_trends方法开头添加:```pythondefplot_trends(self,output_path=None):#设置中文字体支持plt.rcParams['font.sans-serif']= ['SimHei','DejaVuSans']#使用SimHei显示中文,DejaVuSans显示英文plt.rcParams['axes.unicode_minus']= False#正确显示负号#以下为原有的绘图代码... ```注意:如果是在无GUI环境(如服务器)下,可能需要设置matplotlib使用Agg后端:```pythonimportmatplotlibmatplotlib.use('Agg')#在导入pyplot之前设置import matplotlib.pyplot asplt```完整修改后的plot_trends方法(包含字体设置): ```pythondefplot_trends(self,output_path=None):#设置中文字体plt.rcParams['font.sans-serif'] =['SimHei','DejaVuSans']#使用黑体plt.rcParams['axes.unicode_minus']= Falseplt.figure(figsize=(14,7))# ...其余绘图代码不... ```如果以上方法都不行,可以考虑将文字保存为图片(如使用文本图像化),但这比较复杂,通常不需要。另外,如果是在Docker容器中运行,需要确保容器内安装了中文字体。最后,提供一个通用的解决方案,自动查找系统中可用的中文字体(适用于跨平台): ```pythondefset_chinese_font():frommatplotlib importfont_manager#查找系统中所有支持中文的字体chinese_fonts =[f.name forf infont_manager.fontManager.ttflistif any('CJK'in langfor langin f.get_languages())orany('SC' inlang forlang inf.get_languages()) orany('CN' inlang forlang inf.get_languages())]#优先选择黑体或微软雅黑forfont_namein ['SimHei','MicrosoftYaHei','WenQuanYiMicro Hei','KaiTi', 'SimSun']:iffont_namein chinese_fonts:plt.rcParams['font.sans-serif']= [font_name]breakplt.rcParams['axes.unicode_minus']= False#在plot_trends方法中调用def plot_trends(self, output_path=None):set_chinese_font()#...绘图代码... ```注意:这种方法可能会稍微增加启动时间,因为它要遍历字体列表。请根据实际情况选择合适的方法。</think>当趋势图上的文字显示方框(如 □□□)时,通常是因为 matplotlib 不支持中文字体。以下是完整的解决方案: ### 问题原因 1. **系统缺少中文字体**:Matplotlib 默认不包含中文字体 2. **字体配置错误**:未正确指定中文字体 3. **渲染引擎限制**:某些后端(如 Agg)默认不支持复杂字符 ### 完整解决方案 #### 方法一:使用内置中文字体(推荐) ```python import matplotlib.pyplot as plt # 设置中文字体支持 plt.rcParams['font.sans-serif'] = ['SimHei'] # 使用黑体 plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题 # 在 plot_trends 方法中使用 def plot_trends(self, output_path=None): plt.rcParams['font.sans-serif'] = ['SimHei'] # 确保设置 plt.rcParams['axes.unicode_minus'] = False # 原有绘图代码... plt.title('YOLO预测框数量化趋势分析') # 现在能正常显示中文 ``` #### 方法二:指定系统字体文件(跨平台) ```python from matplotlib.font_manager import FontProperties import matplotlib.pyplot as plt def plot_trends(self, output_path=None): # 创建中文字体对象(根据系统选择) if os.name == 'nt': # Windows系统 font = FontProperties(fname='C:\\Windows\\Fonts\\simhei.ttf') # 黑体 else: # Linux/Mac系统 font = FontProperties(fname='/usr/share/fonts/truetype/wqy/wqy-microhei.ttc') # 文泉驿字体 # 应用字体到所有文本元素 plt.figure(figsize=(14, 7)) plt.plot(..., label='原始数量', fontproperties=font) plt.title('YOLO预测框数量化趋势分析', fontproperties=font) plt.xlabel('帧序号', fontproperties=font) plt.ylabel('检测框数量', fontproperties=font) plt.legend(prop=font) # 特别注意图例字体 ``` #### 方法三:安装并使用思源字体(最佳跨平台方案) ```python # 安装思源黑体(首次运行前执行) !pip install fonttools !wget https://github.com/adobe-fonts/source-han-sans/raw/release/OTF/SourceHanSansSC.zip !unzip SourceHanSansSC.zip # 在代码中使用 from matplotlib.font_manager import FontProperties import matplotlib.pyplot as plt def plot_trends(self, output_path=None): # 使用思源黑体 font_path = 'SourceHanSansSC/SourceHanSansSC-Regular.otf' font = FontProperties(fname=font_path) plt.figure(figsize=(14, 7)) plt.title('YOLO预测框数量化趋势分析', fontproperties=font) # ...其他绘图代码... ``` ### 常见系统字体路径参考 | 系统 | 字体路径示例 | 推荐字体 | |---------|--------------------------------------|---------------| | Windows | `C:\Windows\Fonts\simhei.ttf` | 黑体 (SimHei) | | Linux | `/usr/share/fonts/wqy-microhei.ttc` | 文泉驿微米黑 | | macOS | `/System/Library/Fonts/PingFang.ttc` | 苹方字体 | ### 验证字体是否生效 添加以下代码检查可用字体: ```python from matplotlib.font_manager import fontManager import matplotlib.pyplot as plt # 打印所有可用字体 print([f.name for f in fontManager.ttflist if 'han' in f.name.lower() or 'hei' in f.name.lower()]) # 设置后验证 plt.rcParams['font.sans-serif'] = ['SimHei'] plt.text(0.5, 0.5, '中文测试', size=20) plt.savefig('font_test.png') ``` ### 永久解决方案(修改配置文件) 1. 找到 matplotlib 配置文件: ```python import matplotlib print(matplotlib.matplotlib_fname()) # 输出配置文件路径 ``` 2. 编辑该文件: ```ini # 取消注释并修改以下行 font.family : sans-serif font.sans-serif : SimHei, DejaVu Sans, Bitstream Vera Sans, ... axes.unicode_minus : False ``` 3. 删除缓存文件(位置可通过 `print(matplotlib.get_cachedir())` 查看) ### 特殊环境处理(Docker/服务器) ```dockerfile # Dockerfile 示例 FROM python:3.9 # 安装中文字体 RUN apt-get update && apt-get install -y \ fonts-wqy-microhei \ fonts-wqy-zenhei # 复制字体文件 COPY simhei.ttf /usr/share/fonts/ # 重建字体缓存 RUN fc-cache -fv ``` ### 注意事项 1. **图例需要单独设置**:`plt.legend(prop=font)` 2. **保存图片时指定DPI**:`plt.savefig('output.png', dpi=300)` 3. **使用SVG格式避免问题**:`plt.savefig('output.svg')` 4. **避免在无GUI环境使用交互模式**:添加 `matplotlib.use('Agg')` 在导入 pyplot 之前
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值