首页 > 技术文章 > 设置matplotlib.pyplot设置画图的坐标系

shayue 2019-02-19 10:32 原文

今天看了林轩田老师的感知机算法,心血来潮想要做个可视化过程,以便观察更新的过程。

现将学习成果做个记录,下面是画出来的图,这是初始的状态,后面会通过算法找到一条经过原点的直线将两堆数据分割开来。

直线以及两堆数据是随机生成的,下面介绍画出这个图的步骤主要有哪些:

  1. 导入需要的工具包,这个没得说,而且是在jupyter notebook中,所有会使用%matplotlib inline

    import numpy as np
    import matplotlib.pyplot as plt
    %matplotlib inline 
    
  2. 生成数据

    # 设置随机种子
    np.random.seed(325)
    
    # 随机生成o数据
    o_data_x = np.random.randint(40, 80, 5)
    o_data_y = np.random.randint(20, 80, 5)
    o_label = np.array([0,0,0,0,0])
    
    # 随机生成x数据
    x_data_x = np.random.randint(10, 50, 5)
    x_data_y = np.random.randint(60, 90, 5)
    x_label = np.array([1,1,1,1,1])
    
    # 随机生成初始的直线
    w1_w2 = np.random.random(2)
    t = np.linspace(-100,100, 18)
    
  3. 画图

    # 设置画布
    plt.figure(figsize=(8, 8))
    
    # 作点
    plt.scatter(o_data_x, o_data_y, c='b', marker='o', label='0')
    plt.scatter(x_data_x, x_data_y, c='r', marker='x', label='1')
    plt.legend()
    
    # 作初始线
    plt.plot(t, -w1_w2[0]/w1_w2[1]*t)
    
    # 获取当前的坐标轴, gca = get current axis
    ax = plt.gca()
    
    # 设置标题,也可用plt.title()设置
    ax.set_title('Inital', fontsize=20, loc='left')
    
    # 设置右边框和上边框,隐藏
    ax.spines['right'].set_color('none')
    ax.spines['top'].set_color('none')
    
    # 设置x坐标轴为下边框
    ax.xaxis.set_ticks_position('bottom')
    # 设置y坐标轴为左边框
    ax.yaxis.set_ticks_position('left')
    
    # 设置x轴, y轴在(0, 0)的位置
    ax.spines['bottom'].set_position(('data', 0))
    ax.spines['left'].set_position(('data', 0))
    
    # ax.set_xticks与plt.xticks功能一样,都是自行定义x坐标轴的刻度;y轴同理。在这里使用避免原点出现两个同样的0
    ax.set_xticks([-100, -75, -50, -25, 0, 25, 50, 75, 100])
    ax.set_yticks([-100, -75, -50, -25, 25, 50, 75, 100])
    plt.savefig('output.jpg')
    

总结

上述画图涉及的知识点包括:

  1. 画直线图
  2. 画散点图
  3. 设置坐标轴的原点、刻度等

推荐阅读