• 彻底解决Python里matplotlib不显示中文的问题(显示方框)


    加入以下代码即可:
    import matplotlib
    matplotlib.rc("font",family='YouYuan')

    转自https://zhuanlan.zhihu.com/p/104081310?utm_source=wechat_timeline

    在很长一段时间里用Python绘图,matplotlib都不能很好的显示中文,起初是认为我的pycharm里的设置问题,但是发现同样的问题在spyder里也同样的出现了,虽然有的地方可以用英文实在不行用拼音。。。但是在作图这里没有中文真的是太不方便了,机缘巧合下在年前终于找到问题的根源了,于是乎爱刨根问底儿的我把整个过程的解决方法分享给大家~~

    一共有两种解决方案,我强烈推荐第一种,因为更为方便,绘图时不用再写别的参数,调用一次即可,第二种方法也会写出来但是更多的是作为了解,主要因为相比之下太麻烦

    方法一:

    示例:绘制每月的商品数量

    • X轴月份显示为中文
    • 增加X轴Y轴中文,图标标题
    from matplotlib import pyplot as plt
    
    a = ["一月份","二月份","三月份","四月份","五月份","六月份"]
    
    b=[56.01,26.94,17.53,16.49,15.45,12.96]
    
    plt.figure(figsize=(20,8),dpi=80)
    
    plt.bar(range(len(a)),b)
    
    #绘制x轴
    plt.xticks(range(len(a)),a)
    
    plt.xlabel("月份")
    plt.ylabel("数量")
    plt.title("每月数量")
    
    plt.show()

    不出意外绘制出来的图是这样的。。。。。

    绘制出来的图片,在所有应该显示为中文的地方均显示乱码

    之前一直以为是系统中字符集支持的问题,其实并不是这样,根本原因是matplotlib内置的原因,直到我知道了 matplotlib.rc 这个方法,其实这个我也不太会用,那么我们看一下这个的源码写的是该如何使用(学会看源码真的很重要!!)

    首先它肯定是能设置字体和颜色的,有关字体我们怎么设置呢?我们接着往下看

     

    有关字体的设置找到了,可以接收为字典,它利用了**font接收了一下字典,其实我们我们完全可以一行搞定,当然我更喜欢横着写,例如下面这样其实也是OK的~~

    matplotlib.rc("font",family='MicroSoft YaHei',weight="bold")

    那么我们加入这行代码在跑一下试试

    果不其然产生了一个报错,那么我们为什么把MicroSoft YaHei(这个不就是微软雅黑吗,电脑里都有啊)这个加进去会报错呢?

    重点来了

    其实报错只有一个原因就是他没有这个字体,虽然电脑里有这个字体但是不代表matplotlib里也有这个字体,所以解决matplotlib中的中文显示问题主要就是要找到它所内置支持的字体,那么我们首先查看一下它的内置字体,运行以下代码查看所支持的字体

    # 查询当前系统所有字体
    from matplotlib.font_manager import FontManager
    import subprocess
    
    mpl_fonts = set(f.name for f in FontManager().ttflist)
    
    print('all font list get from matplotlib.font_manager:')
    for f in sorted(mpl_fonts):
        print('	' + f)

    运行后他会显示出所有支持的字体,大约100多种。。。。具体的我就不一一列举了

    但是你会发现这个都是英文字体啊,中文字体在哪里,其实我当时也非常困扰,但是细心的我发现了其中的奥秘,>>>其实他是有中文的只不过是用拼音写的....<<<

    其中你会发现有如下字体:

    • DengXian
    • FangSong
    • KaiTi
    • LiSu
    • YouYuan
    • Adobe Fan Heiti Std
    • Adobe Fangsong Std
    • Adobe Heiti Std
    • Adobe Kaiti Std

    其实这些都是中文啊啊啊啊啊啊~~~~激动的我把代码增加一行再试试,随便选了个字体

    from matplotlib import pyplot as plt
    #新增加的两行
    import matplotlib
    matplotlib.rc("font",family='YouYuan')
    
    
    a = ["一月份","二月份","三月份","四月份","五月份","六月份"]
    
    b=[56.01,26.94,17.53,16.49,15.45,12.96]
    
    plt.figure(figsize=(20,8),dpi=80)
    
    plt.bar(range(len(a)),b)
    
    #绘制x轴
    plt.xticks(range(len(a)),a)
    
    plt.xlabel("月份")
    plt.ylabel("数量")
    plt.title("每月数量")
    
    plt.show()

    完美支持,也就是增加了两行代码就解决了中文的显示问题,归根到底还是很多没没有找到matplotlib所支持的内置字体方法,或是找到了不知道怎么用


    方法二:

    找到字体的所在路径

    from matplotlib import font_manager
    my_font = font_manager.FontProperties(fname="/System/Library/Fonts/PingFang.ttc")

    但是他有一个弊端就是在每个图上都需要在多家个参数调用才行,否则的话就会显示不出来

    plt.xticks(range(len(a)),a,fontproperties=my_font)
    
    plt.xlabel("月份",fontproperties=my_font)
    plt.ylabel("数量",fontproperties=my_font)
    plt.title("每月数量",fontproperties=my_font)
  • 相关阅读:
    SimpleRetryTemplateSupplier
    Atcoder Grand Contest 013 E Placing Squares(组合意义转化+矩阵快速幂/代数推导,思维题)
    Atcoder Grand Contest 033 D Complexity(dp)
    Vue案例之计数器
    Redis数据类型之List列表类型
    Redis数据类型之Hash哈希类型
    Vue之vfor列表展示
    Vue初体验
    RedisDesktopManager本地连接云服务器上的Redis
    Redis数据类型之ZSet有序集合类型
  • 原文地址:https://www.cnblogs.com/houfei/p/13489409.html
Copyright © 2020-2023  润新知