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()

  • 相关阅读:
    Android Gradle Plugin指南(五)——Build Variants(构建变种版本号)
    文件内容操作篇clearerr fclose fdopen feof fflush fgetc fgets fileno fopen fputc fputs fread freopen fseek ftell fwrite getc getchar gets
    文件操作篇 close creat dup dup2 fcntl flock fsync lseek mkstemp open read sync write
    嵌入式linux应用程序调试方法
    version control system:git/hg/subversion/cvs/clearcase/vss。software configruation management。代码集成CI:Cruisecontrol/hudson/buildbot
    最值得你所关注的10个C语言开源项目
    如何记录linux终端下的操作日志
    CentOS 5.5 虚拟机安装 VirtualBox 客户端增强功能
    sizeof, strlen区别
    C/C++嵌入式开发面试题
  • 原文地址:https://www.cnblogs.com/lavender1221/p/12765664.html
Copyright © 2011-2022 走看看