zoukankan      html  css  js  c++  java
  • Matplotlib 保存图片、图画接口和显示中文的使用方法

    一、保存图片

    可以通过savefig()方法,将绘制的图形保存为文件:

    import numpy as np
    import matplotlib.pyplot as plt
    
    x = np.linspace(0,10,100)
    fig = plt.figure()
    plt.plot(x,np.sin(x),'-')
    plt.plot(x,np.cos(x),'--')
    fig.savefig('fig.png')

    可以通过下面的方法查看系统支持的图片格式:

    fig.canvas.get_supported_filetypes()

    savefig方法有一些可定制的参数,比如你想得到一个500dpi的图片,并且尽量少的空白:

    plt.savefig('image.jpg', dpi=600,bbox_inches='tight')

    下面是savefig方法的参数说明:

    • fname:文件路径或文件对象,根据扩展名推断文件格式
    • dpi:分辨率,默认100
    • format: 指定文件格式
    • bbox_inches: 要保存的图片范围。‘tight’表示去掉周边空白。
    • facecolor:子图之外的背景颜色,默认白色
    • edgecolor:边界颜色

    二、图像接口

    Matplotlib有两种画图接口:一是便捷的MATLAB风格接口,一个是功能更强大的面向对象接口。

    • MATLAB接口

    MATLAB风格的工具位于pyplot接口中,比如:

    x = np.linspace(0,10,100) # 生成点列表
    plt.figure() # 创建图形
    plt.subplot(2,1,1)  # 行、列、子图编号
    plt.plot(x,np.sin(x))
    plt.subplot(2,1,2)
    plt.plot(x,np.cos(x)) # 第二个子图

    这种接口最重要的特性是有状态的,它会持续跟踪当前的图形和坐标轴,所有plt命令都可以使用。可以使用plt.gcf()方法获取当前图形和plt.gca()获取当前坐标轴的具体信息。

    但是这种接口也有问题。比如,当创建第二个子图的时候,怎么才能回到第一个子图,并增加新内容呢?虽然也能实现,但方法比较复杂。而下面的方式则不存在这个问题。

    • 面向对象的接口

    这种方式可以适应更加复杂的场景,更好地控制你的图形。画图函数不再受到当前‘活动’图形或者坐标轴的限制,而变成了显式的Figure和Axes的方法。下面是个例子:

    fig, ax = plt.subplots(2) # ax是包含两个Axes对象的数组
    ax[0].plot(x,np.sin(x)) # 在每个对象上调用plot()方法
    ax[1].plot(x,np.cos(x))

    三、显示中文

    在默认情况下,如果使用中文,会显示为方框乱码,解决这个问题只要在代码的起始处进行如下设置:

    plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文
    plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号

    以上方法是只能临时使用,每次都要执行。如果想一劳永逸,那么必须修改配置文件。

    import matplotlib as mpl
    mpl.matplotlib_fname()

    用文本编辑器打开上面代码运行后的文件,找到下面这行:

    #font.serif    : DejaVu Serif, Bitstream Vera Serif,...

    将前面的注释符号去掉。

    然后去C:WindowsFontsMicrosoft中复制一个你想要的字体ttf文件,或者别处的字体文件,将它粘贴到..mpl-datafonts tf文件夹中,并给它重命名为Vera.ttf

    还有一个坐标轴的负号正常显示的配置修改:

    #去掉注释符号,同时,改为False
    axes.unicode_minus  : False
  • 相关阅读:
    Docker安装
    Shell编程
    Java:字节流和字符流(输入流和输出流)
    spring中的组合模式
    MySQL:ALTER COLUMN、MODIFY COLUMN 和 CHANGE COLUMN
    springboot项目打包docker镜像maven插件
    OGNL表达式
    项目中redisTemplate设置的key,redis客户端上查询不到的问题
    spring-session-data-redis反序列化问题
    深入理解SPI机制
  • 原文地址:https://www.cnblogs.com/lavender1221/p/12758625.html
Copyright © 2011-2022 走看看