zoukankan      html  css  js  c++  java
  • matplotlib 数据可视化

    图的基本结构

    通常,使用 numpy 组织数据, 使用 matplotlib API 进行数据图像绘制。 一幅数据图基本上包括如下结构:

    1. Data: 数据区,包括数据点、描绘形状
    2. Axis: 坐标轴,包括 X 轴、 Y 轴及其标签、刻度尺及其标签
    3. Title: 标题,数据图的描述
    4. Legend: 图例,区分图中包含的多种曲线或不同分类的数据
    5. 其他的还有图形文本 (Text)、注解 (Annotate)等其他描述

    详细的结构图如下图所示:

    画法

    按照绘图结构,可将数据图的绘制分为如下几个步骤:

    • 导入 matplotlib 包相关工具包
    • 准备数据,numpy 数组存储
    • 绘制原始曲线
    • 配置标题、坐标轴、刻度、图例
    • 添加文字说明、注解
    • 显示、保存绘图结果

    导包

    #coding:utf-8
    import numpy as np
    import matplotlib.pyplot as plt
    from pylab import *

    准备数据

    numpy 常用来组织源数据:

    # 定义数据部分
    x = np.arange(0., 10, 0.2)
    y1 = np.cos(x)
    y2 = np.sin(x)
    y3 = np.sqrt(x)

    绘制基本曲线

    使用 plot 函数直接绘制上述函数曲线,可以通过配置 plot 函数参数调整曲线的样式、粗细、颜色、标记等:

    # 绘制 3 条函数曲线
    plt.plot(x, y1, color='blue', linewidth=1.5, linestyle='-', marker='.', label=r'$y = cos{x}$')
    plt.plot(x, y2, color='green', linewidth=1.5, linestyle='-', marker='*', label=r'$y = sin{x}$')
    plt.plot(x, y3, color='m', linewidth=1.5, linestyle='-', marker='x', label=r'$y = sqrt{x}$')

    设置坐标轴

    # 坐标轴上移
    ax = plt.subplot(111)
    ax.spines['right'].set_color('none')     # 去掉右边的边框线
    ax.spines['top'].set_color('none')       # 去掉上边的边框线
    # 移动下边边框线,相当于移动 X 轴
    ax.xaxis.set_ticks_position('bottom')    
    ax.spines['bottom'].set_position(('data', 0))
    # 移动左边边框线,相当于移动 y 轴
    ax.yaxis.set_ticks_position('left')
    ax.spines['left'].set_position(('data', 0))
    
    # 设置 x, y 轴的刻度取值范围
    plt.xlim(x.min()*1.1, x.max()*1.1)
    plt.ylim(-1.5, 4.0)
    # 设置 x, y 轴的刻度标签值
    plt.xticks([2, 4, 6, 8, 10], [r'2', r'4', r'6', r'8', r'10'])
    plt.yticks([-1.0, 0.0, 1.0, 2.0, 3.0, 4.0], [r'-1.0', r'0.0', r'1.0', r'2.0', r'3.0', r'4.0'])
    """
    plt.yticks([-1.0, 0.0, 1.0, 2.0, 3.0, 4.0])
    """
    
    # 设置标题、x轴、y轴
    plt.title(r'$the  function  figure  of  cos(),  sin()  and  sqrt()$', fontsize=19)
    plt.xlabel(r'$the  input  value  of  x$', fontsize=18, labelpad=88.8)
    plt.ylabel(r'$y = f(x)$', fontsize=18, labelpad=12.5)

    设置文字描述、注解

    在数据图中添加文字描述 text

    plt.text(4, 1.68, r'$x in [0.0,  10.0]$', color='k', fontsize=15)
    plt.text(4, 1.38, r'$y in [-1.0,  4.0]$', color='k', fontsize=15)

    // 其中,r’…’ 语句表示使用 LaTex 公式符号.

    另外,

    文本倾斜:在plt.text()中加入fontstyle='italic'
    文本旋转:在plt.text()中加入参数rotation,例如rotation=45

    在数据图中给特殊点添加注解 annotate

    # 特殊点添加注解
    plt.scatter([8,],[np.sqrt(8),], 50, color ='m')  # 使用散点图放大当前点
    plt.annotate(r'$2sqrt{2}$', xy=(8, np.sqrt(8)), xytext=(8.5, 2.2), fontsize=16, color='#090909', arrowprops=dict(arrowstyle='->', connectionstyle='arc3, rad=0.1', color='#090909'))
    """
    plt.annotate('%.4f' % acc, xy=(thres, acc), xytext=(thres, acc+0.04), ha='center', color='black', arrowprops=dict(arrowstyle='->', color='black'))  #在正上方添加注解
    plt.annotate('%.4f' % cov, xy=(thres, cov), xytext=(thres, cov-0.04), ha='center', color='green', arrowprops=dict(arrowstyle='->', color='green')) #在正下方添加注解, ha表示horizontalalignment(水平对齐)
    """

    设置图例

    可使用如下两种方式,给绘图设置图例:
    1: 在 plt.plot 函数中添加 label 参数后,使用 plt.legend(loc=’up right’)
    2: 不使用参数 label, 直接使用如下命令:

    plt.legend(['cos(x)', 'sin(x)', 'sqrt(x)'], loc='up right')

    loc 参数表示图例的位置,常见的位置参数如下:

     

    网格线开关

    # 显示网格线
    plt.grid(True)

    显示、保存

    plt.show()    # 显示
    # savefig('../figures/plot3d_ex.png',dpi=48)    # 保存,前提目录存在

    其它有用的设置

    1. 调整图像边缘及图像间的空白间隔

    方法1:plt.subplots_adjust()

      自动调整图像外部边缘,但是此方法不能够很好的控制图像间的间隔。

    方法2:plt.subplots_adjust()

      能同时控制图像外侧边缘以及图像间的空白区域,比较灵活.例如 plt.subplots_adjust(left=0.2, bottom=0.2, right=0.8, top=0.8,hspace=0.2, wspace=0.3)

    2.在图中显示中文 

    方法1:使用rcParams,设置其font.family为中文字符

    import matplotlib
    matplotlib.rcParams['font.family'] = 'SimHei'

    前提是系统中有'SimHei'字体

    方法2:指定系统中文字体

    首先,查看系统支持的中文字体列表:

    $ fc-list :lang=zh
    /usr/share/fonts/truetype/arphic/uming.ttc: AR PL UMing TW MBE:style=Light
    /usr/share/fonts/truetype/arphic/ukai.ttc: AR PL UKai CN:style=Book
    /usr/share/fonts/opentype/noto/NotoSansCJK-Bold.ttc: Noto Sans Mono CJK KR,Noto Sans Mono CJK KR Bold:style=Bold,Regular
    /usr/share/fonts/opentype/noto/NotoSansCJK-Black.ttc: Noto Sans CJK TC,Noto Sans CJK TC Black:style=Black,Regular/usr/share/fonts/opentype/noto/NotoSansCJK-Medium.ttc: Noto Sans CJK JP,Noto Sans CJK JP Medium:style=Medium,Regular
    /usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc: Noto Sans CJK JP,Noto Sans CJK JP Regular:style=Regular
    /usr/share/fonts/opentype/noto/NotoSansCJK-Light.ttc: Noto Sans CJK KR,Noto Sans CJK KR Light:style=Light,Regular

    然后,在代码中指定字体设置:

    #coding:utf-8  
    import matplotlib.pyplot as plt  
    from matplotlib.font_manager import FontProperties
    myfont = FontProperties(fname='/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc')   #定义自定义字体,文件名从上一步查看的系统中文字体列表中来   
    plt.plot([x, y])  
    plt.title(u'中文',fontproperties=myfont)  
    plt.text(x=67, y=1.06, s=u'样本数', ha='left', fontproperties=myfont)
    plt.show()  

    参考:

    【Matplotlib】绘图常见设置说明

    Python matplotlib 数据可视化 

    matplotlib 怎么添加倾斜的文字?

    matplotlib绘图基础

    Python科学绘图实例附代码 
    Mooc数据分析-02数据展示 
    matplotlib可视化之如何给图形添加数据标签?

    彻底解决matplotlib中文乱码问题

  • 相关阅读:
    【腾讯Bugly干货分享】微信Tinker的一切都在这里,包括源码(一)
    【腾讯Bugly干货分享】iOS10 SiriKit QQ适配详解
    【腾讯Bugly干货分享】安卓单元测试:What, Why and How
    【腾讯Bugly干货分享】Android Linker 与 SO 加壳技术
    【腾讯优测干货分享】Android内存泄漏的简单检查与分析方法
    【腾讯Bugly经验分享】程序员的成长离不开哪些软技能?
    【腾讯Bugly干货分享】基于 Webpack & Vue & Vue-Router 的 SPA 初体验
    从零开始安装Hadoop视频教程
    如何在MAC机器中实现移动设备WiFI上网(没有专门的无线路由器的情况)
    Alfresco安装与配置图解
  • 原文地址:https://www.cnblogs.com/bymo/p/7280829.html
Copyright © 2011-2022 走看看