zoukankan      html  css  js  c++  java
  • Matplotlib 图形绘制

    一、线型图

    线型图是学习matplotlib绘图的最基础案例。

    import numpy as np
    import matplotlib.pyplot as plt

    下面我们将两条曲线绘制到一个图形里:

    plt.figure()
    x = np.linspace(-10,10,200)
    plt.plot(x, x
    **2) plt.plot(x, x**3)
    plt.show()

    可以看到这种方式下,两个线条共用一个坐标轴,并且自动区分颜色。

    plot方法的核心是plot(x,y),x表示横坐标值的序列,y表示x某个坐标对应的y值,实际上就是y=f(x)函数。当只提供y的时候,x默认使用0-n的整数序列。这里的序列必然是个有限的点集,而不是我们想象中的无穷个点组成一条线。如果你的点很稀疏,那么图形看起来就像折线,如果点很多,看起来就比较圆滑,形似曲线。

    二、散点图

    与线型图类似的是,散点图也是一个个点集构成的。但不同之处在于,散点图的各点之间不会按照前后关系以线条连接起来。

    • 用plt.plot画散点图

    x = np.linspace(0,10,30)
    y = np.sin(x)
    plt.plot(x,y,'bo', ms=5)
    plt.show()

    代码和前面的例子差不多,为什么这里显示的却是散点图而不是sin曲线呢?这是因为一是点集比较少,稀疏,才30个;二是没有指定线型。

    • 用plt.scatter画散点图

    scatter专门用于绘制散点图,使用方式和plot方法类似,区别在于前者具有更高的灵活性,可以单独控制每个散点与数据匹配,并让每个散点具有不同的属性。

    一般使用scatter方法,如下例子就可以了:

    plt.scatter(x, y, marker='o')

    下面看一个随机不同透明度、颜色和大小的散点例子:

    rng = np.random.RandomState(10)
    x = rng.randn(100)
    y = rng.randn(100)
    colors = rng.rand(100)
    sizes = 1000* rng.rand(100)
    
    plt.scatter(x, y, c=colors, s=sizes, alpha=0.3)
    plt.colorbar() # 绘制颜色对照条
    plt.show()

    主要参数说明:

    • x,y:输入数据
    • s:标记大小,以像素为单位
    • c:颜色
    • marker:标记
    • alpha:透明度
    • linewidths:线宽
    • edgecolors :边界颜色

    在处理较少点集的时候scatter方法灵活度更高,可单独配置并渲染,但所需消耗的计算和内存资源也更多。当数据成千上万个之后,plot方法的效率更高,因为它对所有点使用一样的颜色、大小、类型等配置,自然更快。

    三、直方图

    使用hist方法来绘制直方图:

    plt.figure()
    salary = [1050, 2000, 3500, 3000, 4000, 3200, 5000, 4300, 6000]
    group = [1000, 3000, 5000, 7000]
    plt.hist(salary, 4)
    plt.show()

    绘制直方图,最主要的是一个数据集data和需要划分的区间数量bins,另外你也可以设置一些颜色、类型参数:

    plt.hist(np.random.randn(1000), bins=30,normed=True, alpha=0.5, histtype='stepfilled', color='steelblue', edgecolor='none')

    histtype直方图的类型,可以是'bar'、 'barstacked'、'step'和'stepfilled'。

    除了一维的直方图,还可以使用hist2d方法绘制二维的直方图:

    mean = [0,0]  # 忽略数据的创建过程
    cov = [[1,1],[1,2]]
    x,y = np.random.multivariate_normal(mean, cov,10000).T
    
    plt.hist2d(x,y,bins=30,cmap='Blues')  #以蓝色为基调
    cb = plt.colorbar()  # 插入颜色条
    cb.set_label('counts in bin')  # 设置颜色条的标签
    plt.show()

    hist2d是使用坐标轴正交的方块分割区域,还有一种常用的方式是正六边形也就是蜂窝形状的分割。Matplotlib提供的plt.hexbin就是满足这个需求的:

    plt.hexbin(x,y,gridsize=30, cmap='Blues')
    plt.colorbar(label='count in bin')
    plt.show()

    四、柱状图

    柱状图,也被称作条形图,看起来像直方图,但完全是两码事。条形图根据不同的x值,为每个x指定一个高度y,画一个一定宽度的条形;而直方图是对数据集进行区间划分,为每个区间画条形。

    plt.figure()
    x = [1, 2, 3]
    y = [1000, 2000, 3000]
    plt.bar(x, y, color=['r', 'g', 'b'])
    for x, y in zip(x, y):
        plt.text(x, y + 20, y, ha='center', fontsize=12)
    plt.show()

    n = 12   # 12组数据
    X = np.arange(n)
    Y1 = (1 - X / n) * np.random.uniform(0.5, 1.0, n)  # 生成对应的y轴数据
    Y2 = (1 - X / n) * np.random.uniform(0.5, 1.0, n)
    plt.bar(X, +Y1, facecolor='#9999ff', edgecolor='white')  # +号让所有y值变成正数
    plt.bar(X, -Y2, facecolor='#ff9999', edgecolor='white') # 负号让所有y值变成复数
    # 加上数值
    for x, y in zip(X, Y1):  # 显示文本
        plt.text(x, y + 0.05, '%.2f' % y, ha='center', va='bottom')
    for x, y in zip(X, Y2):
        plt.text(x, -y - 0.05, '-%.2f' % y, ha='center', va='top')
    plt.xlim(-0.5, n)
    plt.ylim(-1.25, 1.25)
    plt.show()

    将上面的代码稍微修改一下,就可以得到下面的图形:

    plt.bar(X, Y1, width=0.4, facecolor='lightskyblue', edgecolor='white')
    plt.bar(X+0.4, Y2, width=0.4, facecolor='yellowgreen', edgecolor='white')
    
    for x,y in zip(X,Y1):
        plt.text(x, y+0.05, '%.2f' % y, ha='center', va= 'bottom')
    
    for x,y in zip(X,Y2):
        plt.text(x+0.4, y+0.05, '%.2f' % y, ha='center', va= 'bottom')
    
    plt.xlim(-0.5,6)
    plt.ylim(0,1.25)
    plt.show()

    五、饼图

    通过pie方法,可以绘制饼图:

    labels = '', '', '仓鼠', '乌龟'
    sizes = [15, 30, 45, 10]
    explode = (0, 0.1, 0, 0)  
    plt.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%',
            shadow=True, startangle=90)
    plt.axis('equal') # 设置x轴和y轴均等
    plt.show()

    主要参数说明:

    • x:输入的数据数组
    • explode:数组,可选参数,默认为None。 用来指定每部分从圆中外移的偏移量。 例如:explode=[0,0.2,0,0],第二个饼块被拖出。
    • labels:每个饼块的标记
    • colors:每个饼块的颜色
    • autopct:自动标注百分比,并设置字符串格式
    • shadow:是否添加阴影。
    • labeldistance:被画饼标记的直径。
    • startangle:从x轴逆时针旋转饼图的开始角度。
    • radius:饼图的半径
    • counterclock:指定指针方向,顺时针或者逆时针。
    • center:图表中心位置。
    x = [1000, 2000, 3000]
    explode = [0.01, 0.1, 0.01]  # 圆心距
    label = ['a', 'b', 'c']
    plt.figure(figsize=(6, 6))
    plt.pie(x, explode=explode, labels=label, autopct='%1.1f%%', colors=['r', 'y', 'c'], labeldistance=0.8, pctdistance=0.5)
    plt.show()

    六、雷达图

    一般在处理数据时,要绘制出一组数据中的多个标签的值,matplotlib为我们提供了雷达图来进行绘制。通过polar方法,即可绘制雷达图:

    plt.figure()
    dataLength = 5  # 把整个圆切成5份
    angles = np.linspace(0, 2 * np.pi, dataLength, endpoint=False)
    labels = ['生存', '输出', '发育', '团战', 'KDA']
    data = [2, 3.5, 4, 4.5, 5]
    arr1 = np.array([angles[0]])
    angles = np.concatenate((angles, arr1))
    data.append(data[0])
    plt.polar(angles, data, color='r', marker='o')
    plt.xticks(angles, labels)
    plt.show()

  • 相关阅读:
    小结Fragment与FragmentPagerAdapter的生命周期及其关系
    Android的Touch事件分发机制简单探析
    个人项目开源之c++基于epoll实现高并发游戏盒子(服务端+客户端)源代码
    个人项目开源之Django文件中转站源代码
    个人项目开源之Django图书借阅系统源代码
    个人项目开源之实现矩形树图代码统计工具源代码
    颜色渐变算法
    echarts玩转图表之矩形树图
    解决MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk.问题
    引号有几种
  • 原文地址:https://www.cnblogs.com/lavender1221/p/12765664.html
Copyright © 2011-2022 走看看