VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > 数据分析 >
  • python的绘图包matplot

Matplot绘图

  • 导包:from matplotlib import pyplot as plt

    常用方法:

    • show():一般在最后面做图形显示,plt.show()

      plot():功能是传递数据,让其绘制图形,并且返回的是一个Line2D对象(每条线一个)

      • 如果接受的不是列表,只是值,就只会画点

        from matplotlib import pyplot as plt
        import numpy as np
        plt.plot(1, 2, "ro")
        plt.show()
  • 如果接受的数据是一个一维列表,默认会使用索引作为横坐标,元素值作为纵坐标

    from matplotlib import pyplot as plt
    plt.plot([1, 2, 4, 9, 5, 3])
    plt.show()

    如果接受的数据是两个一维列表,第一个列表元素值作为横坐标,第二个列表元素值作为纵坐标,而且两个值一一对应,形成一个一个坐标点一样

    from matplotlib import pyplot as plt
    plt.plot([1, 2, 3, 4, 5], [5, 4, 3, 2, 1])
    plt.show()
    • 如果使用其他包生成数据较为方便,如numpy

      复制代码
      from matplotlib import pyplot as plt
      import numpy as np
      x = np.linspace(-5, 5, 1000)    # linspace()的功能是在指定区间取n个等分点
      y = x**2
      plt.plot(x, y)
      plt.show()
      复制代码
    • 如果接受的数据是有三个参数,前两个参数和上面一样,第三个参数是线条的样式,又或者是接受的数据是三个三个出现,每三个就会组成一组, 或者分开写效果也是一样的,并且能为每条线设置成不同的样式,如线宽set_linewidth(),虚线风格set_dash_capstyle(),alpha级别(透明图)set_alpha()

    复制代码
    from matplotlib import pyplot as plt
    line1, line2 = plt.plot([1, 2, 3, 4, 5], [5, 4, 3, 2, 1], "g--", [5, 4, 3, 2, 1], [1, 2, 3, 4, 5], "r-")
        line1.set_linewidth(3.0)
    line1.set_dash_capstyle("round")
        line2.set_alpha(0.5)     # 范围值0-1
        plt.axis([0, 7, -2, 7])
        plt.show()
    复制代码
    • axis():坐标轴刻度根据数据范围自动匹配,想要让图形显示在更大的空间中可以通过调用 axis 函数指定每个坐标轴的范围,参数含义: [xmin, xmax, ymin, ymax]

      from matplotlib import pyplot as plt
      plt.plot([1, 2, 3, 4, 5], [5, 4, 3, 2, 1])
      plt.axis([0, 7, -2, 7])
      plt.show()

title():在图表中增加标题,参数描述见例忘意

  • xlabel()、ylabel():在图表坐标轴上添加描述,参数描述见例忘意

  • grid():图表背景是否是格子的,默认为False

    savefig():保存图像

    复制代码
    from matplotlib import pyplot as plt
    import numpy as np
    x = np.linspace(-5, 5, 1000)    # linspace()的功能是在指定区间取n个等分点
    y = x**2
    plt.plot(x, y)
    plt.title("Square Function", fontsize=20)
      plt.xlabel("X", fontsize=16)
    plt.ylabel("y = $x^2$", fontsize=16)   # 里面的$就是解析^的,显示更为美观
      plt.grid(True)
      plt.savefig("my_square_function.png", transparent=True)
      plt.show()
    复制代码
    • subplot():添加子图。第一个参数表示几行,第二个参数表示几列,第三个参数表示第几个(先从左到右,后从上到下)

      复制代码
      from matplotlib import pyplot as plt
      import numpy as np
      x = np.linspace(-1.5, 1.5, 50)
      plt.figure(figsize=(10, 10))
      plt.subplot(3, 2, 1)   # subplot(3, 2, 1)可以简写subplot(321)
      plt.plot(x, x)
      plt.subplot(3, 2, 2)
      plt.plot(x, x**2)
      plt.subplot(3, 2, 3)
      plt.plot(x, x**3)
      plt.subplot(3, 2, 4)
      plt.plot(x, x**4)
      plt.subplot(3, 1, 3)   # 这样会将上面两行各看成一个
      plt.plot(x, np.sin(3*x))
      plt.show()
      复制代码
    • subplot2grid():如果需要更复杂的子图位置设置,可以使用subplot2grid函数代替subplot函数。先指定图形(figure)网格的行数和列数,然后指定子图(是指原有的子图,不算合并的子图)的位置(左上角位置为(0, 0)),然后根据需求设置子图需要占用的行数和列数。

      复制代码
      from matplotlib import pyplot as plt
      import numpy as np
      x = np.linspace(-1.5, 1,5, 50)
      plt.figure(figsize=(8, 6))
      # (3, 3)有9个子图,rowspan表示跨行,colspan表示跨列
      plt.subplot2grid((3,3), (0, 0), rowspan=2, colspan=2)   
      plt.plot(x, x**2)
      plt.subplot2grid((3,3), (0, 2))
      plt.plot(x, x**3)
      plt.subplot2grid((3,3), (1, 2), rowspan=2)
      plt.plot(x, x**4)
      plt.subplot2grid((3,3), (2, 0), colspan=2)
      plt.plot(x, x**5)
      plt.show()
      复制代码
    • figure():如果还想再原有的图像上添加线条,就可以指定figure

      复制代码
      from matplotlib import pyplot as plt
      import numpy as np
      x = np.linspace(-1.4, 1.4, 30)
      plt.figure(1)       # 第一块图像(可以说第一个结果)
      plt.subplot(211)
      plt.plot(x, x**2)
      plt.title("Square and Cube")
      plt.subplot(212)
      plt.plot(x, x**3)
      ​
      plt.figure(2, figsize=(10, 5))    #第二块图像(可以说第二结果)
      plt.subplot(121)
      plt.plot(x, x**4)
      plt.title("y = x**4")
      plt.subplot(122)
      plt.plot(x, x**5)
      plt.title("y = x**5")
      ​
      plt.figure(1)          # 指定第一块图像,但是是在212图表中画线条
      plt.plot(x, -x**3, "r:")
      plt.show()
      复制代码
    • text():绘制文本。前两个值表示文本显示的坐标点,第三个参数是文本内容,之后的参数是文本约束。掌握这种就行,其他的花里胡哨以后用到在

      复制代码
      from matplotlib import pyplot as plt
      import numpy as np
      ​
      x = np.linspace(-1.5, 1.5, 50)
      px = 0.8
      py = px ** 2
      ​
      plt.plot(x, x**2, "b-", px, py, "ro")
      # ha表示horizontalalignment
      plt.text(0, 1.5, "Square Function\ny = $x^2$", fontsize=20, color="blue", ha="center")
      # weight表示字体粗细
      plt.text(px-0.08, py, "Beautiful point", ha="right", weight="heavy")
      plt.text(px, py-0.3, "x = %0.2f\ny = %0.2f" % (px, py), rotation=50, color="gray")
      plt.show()
      复制代码
    • legend(loc="best"):为线条增加图例。需要在绘制线条的过程中增加一个label属性

      复制代码
      from matplotlib importpyplot as plt
      import numpy as np
      x = np.linspace(-1.5, 1.5, 50)
      plt.plot(x, x**2, "g--", label="y = $x^2$")
      plt.plot(x, x**3, "b-", label="y = $x^3$")
      plt.legend(loc="best")
      plt.show()
      复制代码
    • Matplotlib支持非线性缩放,例如对数曲线或分对数缩放(不常用,不做解释)

      复制代码
      from matplotlib import pyplot as plt
      import numpy as np
      x = np.linspace(0.1, 15, 500)
      y = x**3/np.exp(2*x)
      plt.figure(1)
      plt.plot(x, y)
      plt.yscale('linear')
      plt.title('linear')
      plt.grid(True)
      ​
      plt.figure(2)
      plt.plot(x, y)
      plt.yscale('log')
      plt.title('log')
      plt.grid(True)
      ​
      plt.figure(3)
      plt.plot(x, y)
      plt.yscale('logit')
      plt.title('logit')
      plt.grid(True)
      ​
      plt.figure(4)
      plt.plot(x, y - y.mean())
      plt.yscale('symlog', linthreshy=0.05)
      plt.title('symlog')
      plt.grid(True)
      ​
      plt.show()
      复制代码
    • 极坐标:只需在创建‘subplot’是设置projection属性为polar即可。(不常用,不做解释)

      复制代码
      from matplotlib import pyplot as plt
      import numpy as np
      radius = 1 
      theta = np.linspace(0, 2*np.pi*radius, 1000) 
      alpha = np.linspace(0, 2*np.pi, 100) 
      plt.subplot(111, projection='polar') 
      plt.plot(alpha, np.cos(5*alpha)) 
      # plt.plot(theta, np.sin(5*theta), "g-") 
      # plt.plot(theta, 0.5*np.cos(4*theta), "b-") 
      # plt.plot(alpha, alpha) 
      plt.show()
      复制代码
    • 3D图形:你需要导入Axes3D,Axes3D包含了3d图形。然后创建一个subplot设置‘projection’属性为‘3d’。这会返回一个Axes3DSubplot对象,你可以通过调用plot_surface设置x,y,z坐标增加可选的属性。(不常用, 不做解释)

      复制代码
      import matplotlib
      from matplotlib import pyplot as plt
      import numpy as np
      from mpl_toolkits.mplot3d import Axes3D
      ​
      x = np.linspace(-5, 5, 50)
      y = np.linspace(-5, 5, 50)
      X, Y = np.meshgrid(x, y)
      R = np.sqrt(X**2 + Y**2)
      Z = np.cos(R*2)
      ​
      figure = plt.figure(1, figsize=(12, 4))
      subplot3d = plt.subplot(111, projection="3d")
      surface = subplot3d.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=matplotlib.cm.coolwarm, linewidth=0.1)
      plt.show()
      复制代码
    • scatter():散点图绘制。前两个参数是点显示的坐标位置,s表示大小,c表示颜色,alpha表示透明度,edgcolor表示边框颜色

      复制代码
      from numpy.random import rand
      from matplotlib import pyplot as plt
      ​
      for color in ["red", "green", "blue", "pink"]:
          # rand功能:第一个参数表示返回值的个数,第二个参数表示一个返回值的元素有多少个,元素值都在0-1
          # randn功能:一样,元素值是从标准正态分布中获取
          x, y, w = rand(3, 100)
          w = 500 * w**5
          plt.scatter(x, y, s=w, c=color, alpha=0.5, edgecolors="blue")
      plt.grid(True)
      plt.show()
      ​
      复制代码
    • hist():绘制直方图的使用。第一个参数是一系列的数据,第二个参数是这些数据定义一个一个范围,第三个参数就是柱子的宽度。绘制的直方图就是对范围的统计数

      复制代码
      from matplotlib import pyplot as plt
      from numpy.random import rand
      ​
      data = list(map(lambda x: int(x), rand(1, 10)[0]*40))
      print(data)
      plt.subplot(211)
      ​
      plt.hist(data, bins=10, rwidth=0.8)
      ​
      plt.subplot(212)
      plt.hist(data, bins=[0, 8, 16, 24, 32, 40], rwidth=0.95)
      ​
      plt.show()
      复制代码
    • 直方图的另一种表现形式

      复制代码
      from matplotlib import pyplot as plt, animation
      import numpy as np
      ​
      data1 = np.random.randn(400)
      data2 = np.random.randn(500) + 3
      data3 = np.random.randn(450) + 6
      data4a = np.random.randn(200) + 9
      data4b = np.random.randn(100) + 10
      ​
      plt.hist(data1, bins=5, color='g', alpha=0.75, label='bar hist')
      # default histtype='bar'
      plt.hist(data2, color='b', alpha=0.65, histtype='stepfilled', label='stepfilled hist')
      plt.hist(data3, color='r', histtype='step', label='step hist')
      plt.hist((data4a, data4b), color=('r', 'm'), alpha=0.55, histtype='barstacked', label=('barstacked a', 'barstacked b'))
      plt.xlabel("Value")
      plt.ylabel("Frequency")
      plt.legend()
      plt.grid(True)
      plt.show()
      复制代码


相关教程