zoukankan      html  css  js  c++  java
  • Matplotlib-画图种类

    Scatter 散点图

    本节我们将讲述各种不同的plot的方式。之前我们讲到了如何plot线,今天我们讲述如何plot散点图。

    # 首先,先引入matplotlib.pyplot简写作plt,再引入模块numpy用来产生一些随机数据。
    # 生成1024个呈标准正态分布的二维数据组 (平均数是0,方差为1) 作为一个数据集,并图像化这个数据集。
    # 每一个点的颜色值用T来表示:
    
    import matplotlib.pyplot as plt
    import numpy as np
    
    n = 1024    # data size
    X = np.random.normal(0, 1, n) # 每一个点的X值
    Y = np.random.normal(0, 1, n) # 每一个点的Y值
    T = np.arctan2(Y,X) # for color value
    
    # 数据集生成完毕,现在来用scatterplot这个点集,鼠标点上去,可以看到这个函数的各个parameter的描述,如下图:
    
    # 输入X和Y作为location,size=75,颜色为T,color map用默认值,透明度alpha 为 50%。 
    # x轴显示范围定位(-1.5,1.5),并用xtick()函数来隐藏x坐标轴,y轴同理:
    plt.scatter(X, Y, s=75, c=T, alpha=.5)
    
    plt.xlim(-1.5, 1.5)
    plt.xticks(())  # ignore xticks
    plt.ylim(-1.5, 1.5)
    plt.yticks(())  # ignore yticks
    
    plt.show()

     Bar 柱状图

    本节我们介绍一下用matplotib来制作一个柱状图,

    生成基本图形

    向上向下分别生成12个数据,X为 0 到 11 的整数 ,Y是相应的均匀分布的随机数据。使用的函数是plt.bar,参数为X和Y:
    # Bar 柱状图
    
    # 生成基本图形
    # 向上向下分别生成12个数据,X为 0 到 11 的整数 ,Y是相应的均匀分布的随机数据。 
    # 使用的函数是plt.bar,参数为X和Y:
    
    import matplotlib.pyplot as plt
    import numpy as np
    
    n = 12
    X = np.arange(n)
    Y1 = (1 - X / float(n)) * np.random.uniform(0.5, 1.0, n)
    Y2 = (1 - X / float(n)) * np.random.uniform(0.5, 1.0, n)
    
    plt.bar(X, +Y1, facecolor='#9999ff', edgecolor='white')
    plt.bar(X, -Y2, facecolor='#ff9999', edgecolor='white')
    
    plt.xlim(-.5, n)
    plt.xticks(())
    plt.ylim(-1.25, 1.25)
    plt.yticks(())
    
    plt.show()
    
    # 这样我们就生成了下图所示的柱状图基本框架:
    # 加颜色和数据
    # 下面我们就颜色和数值进行优化。 用facecolor设置主体颜色,edgecolor设置边框颜色为白色,
    
    # 接下来我们用函数plt.text分别在柱体上方(下方)加上数值,
    # 用%.2f保留两位小数,横向居中对齐ha='center',纵向底部(顶部)对齐va='bottom':
    import matplotlib.pyplot as plt
    import numpy as np
    
    n = 12
    X = np.arange(n)
    Y1 = (1 - X / float(n)) * np.random.uniform(0.5, 1.0, n)
    Y2 = (1 - X / float(n)) * np.random.uniform(0.5, 1.0, n)
    
    plt.bar(X, +Y1, facecolor='#9999ff', edgecolor='white')
    plt.bar(X, -Y2, facecolor='#ff9999', edgecolor='white')
    
    plt.xlim(-.5, n)
    plt.xticks(())
    plt.ylim(-1.25, 1.25)
    plt.yticks(())
    
    
    for x, y in zip(X, Y1):
        # ha: horizontal alignment 水平对齐
        # va: vertical alignment  垂直对齐
        plt.text(x + 0.4, y + 0.05, '%.2f' % y, ha='center', va='bottom')
    
    for x, y in zip(X, Y2):
        # ha: horizontal alignment
        # va: vertical alignment
        plt.text(x + 0.4, -y - 0.05, '%.2f' % y, ha='center', va='top')
    plt.show() 

    Contours 等高线图

    contour美: ['kɑn.tʊr] 英: ['kɒntʊə(r)]n.轮廓;等高线

    画等高线
    添加高度数字
    Contours 等高线图
    
    #数据集即三维点 (x,y) 和对应的高度值,共有256个点。高度值使用一个 height function f(x,y) 生成。 x, y 分别是在区间 [-3,3] 中均匀分布的256个值,并用meshgrid在二维平面中将每一个x和每一个y分别对应起来,编织成栅格:
    
    import matplotlib.pyplot as plt
    import numpy as np
    
    def f(x,y):
        # the height function
        return (1 - x / 2 + x**5 + y**3) * np.exp(-x**2 -y**2)
    
    n = 256
    x = np.linspace(-3, 3, n)
    y = np.linspace(-3, 3, n)
    X,Y = np.meshgrid(x, y)
    # 接下来进行颜色填充。使用函数plt.contourf把颜色加进去,位置参数分别为:X, Y, f(X,Y)。透明度0.75,并将 f(X,Y) 的值对应到color map的暖色组中寻找对应颜色。
    
    # use plt.contourf to filling contours
    # X, Y and value for (X,Y) point
    plt.contourf(X, Y, f(X, Y), 8, alpha=.75, cmap=plt.cm.hot)
    
    # 接下来进行等高线绘制。使用plt.contour函数划线。位置参数为:X, Y, f(X,Y)。颜色选黑色,线条宽度选0.5。现在的结果如下图所示,只有颜色和线条,还没有数值Label:
    # use plt.contour to add contour lines
    C = plt.contour(X, Y, f(X, Y), 8, colors='black', linewidth=.5)
    
    # 添加高度数字
    
    # 其中,8代表等高线的密集程度,这里被分为10个部分。如果是0,则图像被一分为二。
    #最后加入Label,inline控制是否将Label画在线里面,字体大小为10。并将坐标轴隐藏:
    plt.clabel(C, inline=True, fontsize=10)
    plt.xticks(())
    plt.yticks(())

    Image 图片

    随机矩阵画图
    出图方式
    colorbar
    # 随机矩阵画图
    #这一节我们讲解怎样在matplotlib中打印出图像。这里我们打印出的是纯粹的数字,而非自然图像。 我们今天用这样 3x3 的 2D-array 来表示点的颜色,每一个点就是一个pixel。
    import matplotlib.pyplot as plt
    import numpy as np
    
    a = np.array([0.313660827978, 0.365348418405, 0.423733120134,
                  0.365348418405, 0.439599930621, 0.525083754405,
                  0.423733120134, 0.525083754405, 0.651536351379]).reshape(3,3)
    # 三行三列的格子,a代表每一个值,图像右边有一个注释,白色代表值最大的地方,颜色越深值越小。下面我们来看代码:
    plt.imshow(a, interpolation='nearest', cmap='bone', origin='lower')
    
    # 我们之前选cmap的参数时用的是:cmap=plt.cmap.bone,而现在,我们可以直接用单引号传入参数。 origin='lower'代表的就是选择的原点的位置。
    
    # 出图方式
    # 我们在这个链接 可以看到matplotlib官网上对于内插法的不同方法的描述。下图是一个示例:
    
    # 这里我们使用的是内插法中的 Nearest-neighbor 的方法,其他的方式也都可以随意取选。

    plt.imshow(a, interpolation='nearest', cmap='bone', origin='lower'
    
    
    
    # colorbar
    
    # 下面我们添加一个colorbar ,其中我们添加一个shrink参数,使colorbar的长度变短为原来的92%:
    
    plt.colorbar(shrink=.92)
    
    plt.xticks(())
    plt.yticks(())
    plt.show()

    3D 数据

    3D 图
    投影
    # 3D 数据
    
    # 首先在进行 3D Plot 时除了导入 matplotlib ,还要额外添加一个模块,即 Axes 3D 3D 坐标轴显示:
    
    import numpy as np
    import matplotlib.pyplot as plt
    from mpl_toolkits.mplot3d import Axes3D
    # 之后要先定义一个图像窗口,在窗口上添加3D坐标轴,显示成下图:
    fig = plt.figure()
    ax = Axes3D(fig)
    # 接下来给进 X 和 Y 值,并将 X 和 Y 编织成栅格。每一个(X, Y)点对应的高度值我们用下面这个函数来计算。
    
    # X, Y value
    X = np.arange(-4, 4, 0.25)
    Y = np.arange(-4, 4, 0.25)
    X, Y = np.meshgrid(X, Y)    # x-y 平面的网格
    R = np.sqrt(X ** 2 + Y ** 2)
    # height value
    Z = np.sin(R)
    # 做出一个三维曲面,并将一个 colormap rainbow 填充颜色,之后将三维图像投影到 XY 平面上做一个等高线图。 plot 3D 图像:
    ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=plt.get_cmap('rainbow'))
    

    # 其中,rstride 和 cstride 分别代表 row 和 column 的跨度。 # 投影 # 下面添加 XY 平面的等高线:' ax.contourf(X, Y, Z, zdir='z', offset=-2, cmap=plt.get_cmap('rainbow'))

    # zdir='z'可以选择x,y,z
  • 相关阅读:
    PAT 1012 数字分类 (20)
    HDU 3903 Trigonometric Function(数学定理)
    HUST 1600 Lucky Numbers
    HUST 1599
    FZU 2092 收集水晶(记忆化搜索)
    Java实现 蓝桥杯 算法训练 字符串长度(IO无敌)
    Java实现 蓝桥杯 算法训练 字符串长度(IO无敌)
    Java实现 蓝桥杯 算法训练 Remember the A La Mode(暴力)
    Java实现 蓝桥杯 算法训练 Remember the A La Mode(暴力)
    Java实现 蓝桥杯 算法训练 Remember the A La Mode(暴力)
  • 原文地址:https://www.cnblogs.com/foremostxl/p/10356801.html
Copyright © 2011-2022 走看看