zoukankan      html  css  js  c++  java
  • Matplotlib入门

    首先补充一下python shell,ipython shell及jupyter概念。

    python shell:安装python后系统终端进入的输入界面,不好用。

    ipython shell::安装ipython后即有,通过anaconda终端(anaconda prompt)输入ipython进入。每次执行的是"In[xxx ]"本次输入

    jupyter:即ipython notebook(是ipython的网页版,可以植入各种模式,文字、图片、代码等)。%matplotlib等就是针对此平台的。(用这个或spyder)

     1 #导入Matplotlib
     2 import matplotlib as mpl                 #交互界面中
     3 import matplotlib.pyplot as plt
     4 
     5 #设置绘图格式
     6 plt.style.use('classic')
     7 
     8 #显示图形
     9 plt.show()
    10 
    11 #作图
    12 fig = plt.figure()                 #plt.figure生成图片(这张纸)
    13 ax = plt.axes()                    #plt.axes生成坐标轴
    14 x = np.linspace(0, 10, 1000)
    15 ax.plot(x, np.sin(x));            #ax.plot说明图线是通过坐标轴画出的。
    16 plt.plot(x, np.sin(x))              #也可以用pylab接口画-plt
    17 plt.plot(x, np.sin(x))                #想在图中多家一条线,可以重复调用plot命令。
    18 
    19 plt.plot(x, x + 4, linestyle='-')      # 实线
    20 plt.plot(x, x + 5, linestyle='--')     # 虚线
    21 plt.plot(x, x + 6, linestyle='-.')     # 点划线
    22 plt.plot(x, x + 7, linestyle=':');     # 实点线
    23 
    24 plt.plot(x, x + 0, '-g')               # 绿色实线
    25 plt.plot(x, x + 1, '--c')              # 青色虚线
    26 plt.plot(x, x + 2, '-.k')              # 黑色点划线
    27 plt.plot(x, x + 3, ':r');              # 红色实点线
    28 
    29 plt.xlim(-1, 11)                        #调整坐标轴
    30 plt.ylim(-1.5, 1.5)
    31 plt.xlim(10, 0)                      #坐标轴逆序
    32 plt.ylim(1.2, -1.2);
    33 
    34 plt.axis([xmin, xmax, ymin, ymax]);   #一行代码设置坐标刻度
    35 plt.axis('tight')     # 按照图形内容自动收紧坐标轴,不留空白。
    36 plt.axis('equal')     #x轴y轴是1:1,单位长度相等。
    37 
    38 #设置图形标签,更细节的这些标签的设置风格参考文档
    39 plt.title("A Sine Curve")        #设置图题
    40 plt.xlabel("x")                  #x轴标签
    41 plt.ylabel("sin(x)")             #y轴标签
    42 plt.legend()                     #图例
    43 
    44 #标签也可以在plt.plot函数中设置
    45 plt.plot(x, np.sin(x), '-g', label='sin(x)')

    虽然绝大多数的 plt 函数都可以直接转换成 ax 方法(例如plt.plot() → ax.plot()、 plt.legend() → ax.legend()等) , 但是并非所有的命令都可以这样用。 尤其是用来设置坐标轴上下限、 坐标轴标题和图形标题的函数, 它们大都稍有差别。 一些MATLAB 风格的方法和面向对象方法的转换如下所示

     1 plt.xlabel() → ax.set_xlabel()
     2 plt.ylabel() → ax.set_ylabel()
     3 plt.xlim() → ax.set_xlim()
     4 plt.ylim() → ax.set_ylim()
     5 plt.title() → ax.set_title()
     6 
     7 #通常的一次性设置做法:
     8  ax = plt.axes()  #创建坐标轴
     9 ax.plot(x, np.sin(x))
    10 ax.set(xlim=(0, 10), ylim=(-2, 2),xlabel='x', ylabel='sin(x)',
    11 title='A Simple Plot');
    12 
    13 
    14 # 先创建图形网格
    15 # ax是一个包含两个Axes对象的数组
    16 fig, ax = plt.subplots(2)     #两个子图片
    17 # 在每个对象上调用plot()方法
    18 ax[0].plot(x, np.sin(x))      #子图片1
    19 ax[1].plot(x, np.cos(x))      #子图片2

    散点图函数plt.plot和plt.scatter区别

    1 plt.scatter #更高级灵活,可单独控制每个点的设置。
    2 plt.plot   #效率更高性能好,当大型数据时。(eg.几千个点时)

    plt.plot函数:

     1 x = np.linspace(0, 10, 30)
     2 y = np.sin(x)
     3 plt.plot(x, y, 'o', color='black')
     4 plt.plot(x, y, '-ok'); # 直线(-) 、 圆圈(o) 、 黑色(k)
     5 
     6 #颜色之间的对应关系:
     7                 b---blue   c---cyan  g---green    k----black
     8                 m---magenta r---red  w---white    y----yellow
     9 #符号和线型对应关系 :
    10                     -      实线
    11                     --     短线
    12                     -.     短点相间线
    13                     :     虚点线

    在这里插入图片描述

    plt.scatter函数

    1 plt.scatter(x, y, c=colors, s=sizes, alpha=0.3,cmap='viridis')   #  alpha表示标注点的颜色透明度,cmap表示配色系,比如viridis是代指某三种搭配颜色。因此可以做到用颜色和点的标注或尺寸大小表示两个变量,这样在二维坐标系中一个点可以表示四个量(x , y , 点颜色,点大小)。

    plt.fill_between  : 对曲线添加不同宽度色块表示连续误差

    matplotlib三维可视化(本质是二维): plt.contour、 plt.contourf 与 plt.imshow

     1 #contour()函数画普通黑白等高线图
     2 x = np.linspace(0, 5, 50)
     3 y = np.linspace(0, 5, 40)
     4 X, Y = np.meshgrid(x, y)
     5 Z = f(X, Y)
     6 plt.contour(X, Y, Z, colors='black');     
     7 plt.colorbar();  #作出右边图例(类似CFD的那种)通用。
     8 
     9 #contourf()函数画出等高线间填充过的等高图形  ,缺点是颜色改变非连续(等高)
    10 plt.contourf(X, Y, Z, 20, cmap='RdGy')
    11 
    12 #imshow()函数,不支持用 x 轴和 y 轴数据设置网格, 而是必须通过extent 参数设置图形的坐标范围 [xmin, xmax, ymin, ymax]。
    13 plt.imshow(Z, extent=[0, 5, 0, 5], origin='lower',cmap='RdGy')
    
    频次(率)直方图

    由样本上下界将区间等分成m个小区间(b-a)/n, 则本区间矩形的高为(f/n)/((b-a)/n) ,样本点落入本区间内的概率f/n即为矩形的面积.

    1 import numpy as np
    2 import matplotlib.pyplot as plt
    3 plt.style.use('seaborn-white')
    4 data = np.random.randn(1000)
    5 plt.hist(data, bins=100, density=True, alpha=0.8,   #最基础的频次直方图函数plt.hist()
    6 histtype='stepfilled', color='steelblue',edgecolor='none')   # bins值代表横坐标被分区间个数,越大,单个矩形宽越小。

    在这里插入图片描述

     1 #用频次直方图对不同分布特征的样本进行对比时, 将histtype='stepfilled' 与透明性设置参数 alpha 搭配使用的效果非常好。(多个直方图在一张图对比)
     2 x1 = np.random.normal(0, 0.8, 1000)
     3 x2 = np.random.normal(-2, 1, 1000)
     4 x3 = np.random.normal(3, 2, 1000)
     5 kwargs = dict(histtype='stepfilled', alpha=0.3, normed=True, bins=40)
     6 plt.hist(x1, **kwargs)
     7 plt.hist(x2, **kwargs)
     8 plt.hist(x3, **kwargs);
     9 
    10 #计算每段区间的样本数而并不想画图显示它们,直接用 np.histogram()
    11 counts, bin_edges = np.histogram(data, bins=5)
    12 print(counts)

    在这里插入图片描述
    二维频次直方图与数据区间划分
    plt.hist2d: 二维频次直方图(正方形划分) ,此外还有plt.hexbin六边形区间划分
    以下为plt.hist2d正方形划分。

    1 mean = [0, 0]
    2 cov = [[1,1], [1,2]]
    3 x, y = np.random.multivariate_normal(mean, cov, 10000).T   #用一个多元高斯分布(multivariate Gaussian distribution) 生成 x 轴与 y 轴的样本数据。
    4 plt.hist2d(x, y, bins=30, cmap='Blues')
    5 cb = plt.colorbar()
    6 cb.set_label('counts in bin')

    在这里插入图片描述
    还有一种评估多维数据分布密度的常用方法是核密度估计(kernel density estimation, KDE)。

    用matplotlib画三维图:mplot3d函数

     1 #画一个空的三维坐标系
     2 from mpl_toolkits import mplot3d
     3 fig = plt.figure()               #生成空白图
     4 ax = plt.axes(projection='3d')   #生成坐标轴,附加(projection='3d')即可。 
     5  ax = plt.axes(projection='3d')
     6  
     7 # 三维线的数据
     8 zline = np.linspace(0, 15, 1000)
     9 xline = np.sin(zline)
    10 yline = np.cos(zline)
    11 ax.plot3D(xline, yline, zline, 'gray')
    12 
    13 # 三维散点的数据
    14 zdata = 15 * np.random.random(100)
    15 xdata = np.sin(zdata) + 0.1 * np.random.randn(100)
    16 ydata = np.cos(zdata) + 0.1 * np.random.randn(100)
    17 ax.scatter3D(xdata, ydata, zdata, c=zdata, cmap='Greens');

    在这里插入图片描述

    绘制三维等高线图:ax.contour3D

     1 def f(x, y):
     2 return np.sin(np.sqrt(x ** 2 + y ** 2))
     3 x = np.linspace(-6, 6, 30)
     4 y = np.linspace(-6, 6, 30)
     5 X, Y = np.meshgrid(x, y)
     6 Z = f(X, Y)
     7 
     8 fig = plt.figure()
     9 ax = plt.axes(projection='3d')
    10 ax.contour3D(X, Y, Z, 50, cmap='binary')
    11 ax.set_xlabel('x')
    12 ax.set_ylabel('y')
    13 ax.set_zlabel('z');
    14 
    15 ax.view_init(60, 35)    #view_init(a,b)调整观察角度a和方位角b,  a: xy平面的旋转角,b: 绕Z轴顺时针旋转角度。
    16 fig

    在这里插入图片描述

    绘制三维曲面图:需要二维数据(直角坐标或极坐标均可)。
    ax.plot_surface

    1  r = np.linspace(0, 6, 20)
    2 theta = np.linspace(-0.9 * np.pi, 0.8 * np.pi, 40)
    3 r, theta = np.meshgrid(r, theta)
    4 X = r * np.sin(theta)
    5 Y = r * np.cos(theta)
    6 Z = f(X, Y)
    7 ax = plt.axes(projection='3d')
    8 ax.plot_surface(X, Y, Z, rstride=1, cstride=1,
    9 cmap='viridis', edgecolor='none');

    在这里插入图片描述

  • 相关阅读:
    网络基础 HTTP协议之http url简介
    MySql 简单统计查询消耗时间脚本
    Java java jdk在Linux下安装与环境变量的配置
    MySql 正则表达式简介及使用
    MySql UNIX_TIMESTAMP和FROM_UNIXTIME函数讲解
    MySql 定时任务的使用
    MySql 利用crontab实现MySql定时任务
    MySql 利用mysql&mysqldum导入导出数据
    排错-windows平台下访问oracle em出现空白的解决方法
    Oracle 修改oracle数据库名
  • 原文地址:https://www.cnblogs.com/Henry-ZHAO/p/12725348.html
Copyright © 2011-2022 走看看