数据可视化(matplotilb)

一,matplotilb库(数学绘图库)

    mat数学 plot绘图  lib库

    matplotlib.pyplot(缩写mp)->python 最常用接口

    mp.plot(水平坐标,垂直坐标数组)

    X:[1 2 3 4]

    Y:[5 6 7 8]

    .mp.plot(X,Y)

    代码:plot(xxx,linestyle=线型,linewidth=线宽,color=颜色)

  例:

  

 1 import numpy as np
 2 import matplotlib.pyplot as mp
 3 from numpy import pi
 4 
 5 x= np.linspace(-np.pi,np.pi,1000)  #线性空间划分  1000个横坐标
 6 #余弦曲线坐标
 7 cos_y = np.cos(x)/2  #x是一个数组 numpy的cos可以接受数组,无需遍历矢量化
 8 #正弦曲线坐标
 9 sin_y = np.sin(x)
10 #x水平坐标,cos_y , sin_y 垂直坐标
11 # mp.plot((x,cos_y),color='limegreen')
12 mp.plot(x,cos_y,linestyle='--',linewidth=10,color='black')
13 mp.plot(x,sin_y)
14 mp.show()
View Code

 

  看手册功能:help(mp.plot)

  设置图标范围

    mp.xlim(左边界,右边界)

    mp.xlim(地边界,顶边界)

    功能:设置图标范围

    如果设置最大值最小值,则全部填满。

  显示弧度值:

    mp.xticks(刻度位置数组,刻度文本数组)

    mp.yticks(刻度位置数组,刻度文本数组)

    刻度文本数组转义字符串写法:

      [r'$\pi$,r'$\frac{分子}{分母}$',r'$0$']

      3/4pi = >r'$\frac{3\pi}{4}$'

  引十字座标:

    作用:拿到框线的轴

      ax=mp.gca()    #获取等前坐标轴

      ax.spines['left'].set_position(('data',0))  #设置位置边框(有四边)    

         ax.spines['left'].set_color(颜色)    #设置位置边框颜色

 

    显示图列和位置

      mp.plot(...,label=r'$y=sin(x)$')

      mp.legend(loc='upper left')

    标记一些特殊的点:

      散点图(不连线)

      mp.scatter(水平坐标数组,垂直坐标数组,marker=点型,s=大小,edgecolor=勾边色,faceolor=填充色,zorder=Z序)

      Z序就是绘画的顺序,zorder数越大,点越晚压在线上

        Matplotilb绘画顺序是线画点,再画线

     图上做注释:

      mp.annotate(备注文本,xy=目标位置,需要coords=目标坐标系,xytext=文本位置,Textcoords=文本坐标系,fontsize=字体大小,arrowprops=箭头属性)

  例:

 1 import numpy as np
 2 import matplotlib.pyplot as mp
 3 
 4 x =np.linspace(-np.pi,np.pi,1000)  #线性空间划分
 5 
 6 cos_y = np.cos(x)/2     #x是一个数组nupmy的cos可以接受数组,无需遍历矢量化
 7 sin_y=np.sin(x)
 8 xo=np.pi*3/4
 9 yo_cos=np.cos(xo)/2
10 yo_sin = np.sin(xo)
11 
12 
13 # mp.xlim(x.min(),x.max())  #取最小的值做x的左边界,最大值右边界
14 # mp.ylim(sin_y.min(),sin_y.max())
15 
16 #乘上1.1,上下左右都空开距离
17 mp.xlim(x.min()*1.1,x.max()*1.1)
18 mp.ylim(sin_y.min()*1.1,sin_y.max()*1.1)
19 
20 mp.xticks([
21     -np.pi,-np.pi/2,0,np.pi/2,np.pi*3/4,np.pi],
22     [r'$-\pi$',r'$-\frac{\pi}{2}$',r'$0$',r'$\frac{\pi}{2}$',r'$\frac{3\pi}{4}$',r'$\pi$']
23 )
24 mp.yticks([-1,-0.5,0,5,1])
25 
26 ax = mp.gca()
27 ax.spines['left'].set_position(('data',0))
28 ax.spines['bottom'].set_position(('data',0))
29 ax.spines['right'].set_color('none')       #设置为color=none就没有边框了
30 ax.spines['top'].set_color('none')      #设置为color=none就没有边框了
31 
32 
33 mp.scatter([xo,xo],[yo_cos,yo_sin],s=60,
34            edgecolors='limegreen',facecolor='white',zorder=10
35            )
36 
37 mp.annotate(
38     r'$\frac{1}{2}cos(\frac{3\pi}{4})=-\frac{\sqrt{2}}{4}$',
39     xy=(xo,yo_cos),xycoords='data',
40     xytext=(-90,-40),textcoords='offset points',
41     fontsize=14,
42     arrowprops=dict(arrowstyle='->',connectionstyle='arc3,rad=.2'))
43 
44 mp.annotate(
45     r'$sin(\frac{3\pi}{4})=-\frac{\sqrt{2}}{2}$',
46     xy=(xo,yo_sin),xycoords='data',
47     xytext=(20,20),textcoords='offset points',
48     fontsize=14,
49     arrowprops=dict(arrowstyle='->', connectionstyle='arc3,rad=.2'))
50 
51 
52 
53 
54 mp.plot([xo,xo],[yo_cos,yo_sin],linestyle='--',linewidth=1,color='limegreen')
55 
56 mp.plot(x,cos_y,linestyle='-',linewidth=2,color='dodgerblue',label =r'$y=cos(x)$')
57 mp.plot(x,sin_y,linestyle='-',linewidth=2,color='orangered',label =r'$y=sin(x)$')
58 mp.legend(loc='upper left')
59 mp.show()
View Code

 

==============================================以上是常用matplotilb方法=====================================================

图形对象

  1.具体写法:

      mp.figure(图形对象名,figsize=窗口大小,dpi=分辨率,facecolor=窗口颜色)

      mp.figure()方法:

        第一次调用是创建,第二次创建为再次置为当前口

      mp.title()写标题

        mp.title('XXXX',fontsize=20)

      mp.xlabel()坐标轴的标签

        mp.xlabel(标签文字,字体大小)

        mp.xlabel('x',fortsize=12)

      mp.tick_params()设置刻度参数

        mp.tick_params(labelsize=10)

      mp.grid()设置格线

        mp.grid(linestyle=':')

      例:

 1 import numpy as np
 2 import matplotlib.pyplot as mp
 3 
 4 x= np.linspace(-np.pi,np.pi,1000)
 5 cos_y = np.cos(x)/2
 6 sin_y=np.sin(x)
 7 
 8 mp.figure('Figuer Objecti 1',figsize=(6,4),dpi=120,facecolor='lightgray')
 9 mp.title('Figure Objcet 1',fontsize=16)
10 
11 mp.xlabel('x',fontsize=12)
12 mp.xlabel('y',fontsize=12)
13 mp.tick_params(labelsize=10)
14 mp.grid(linestyle=':')
15 
16 mp.figure('Figuer Objecti 2',figsize=(6,4),dpi=120,facecolor='lightgray')
17 mp.title('Figure Objcet 2',fontsize=16)
18 
19 mp.xlabel('x',fontsize=12)
20 mp.xlabel('y',fontsize=12)
21 mp.tick_params(labelsize=10)
22 mp.grid(linestyle=':')
23 
24 
25 mp.figure('Figuer Objecti 1') #再调用一下figuer o1,就会到1的窗口下绘画
26 mp.plot(x,cos_y,label=r'$y=\frac{1}{2}cos(x)$')
27 mp.legend()
28 mp.figure('Figuer Objecti 2') #再调用一下figuer o2,就会到2的窗口下绘画
29 mp.plot(x,sin_y,label=r'$y=sin(x)$')
30 mp.legend()
31 
32 mp.show()   #只有show针对所有,其余的函数都只针对当前对象
View Code

 

  2.图形

    1)子图

      创建子图,大图里创建子图

      1.缺省(默认)布局:

        mp.subplot(行数,列数,图号)  

      例:mp.subplot(2,3,1)或者mp.subplot(231)

        子图显示文字:

          mp.text(对应中心位置的比例,对应中心位置的比例,图号数值,

              ha=水平对其方式,va=垂直对齐方式,

              size=尺寸大小,alpha=透明度)

          mp.tight_layout()     紧凑 不空很多格 边距变窄  

       例:

 1 import matplotlib.pyplot as mp
 2 mp.figure(facecolor='lightgray')
 3 for i in range(2):      #2代表2行
 4     for j in range(3):      #3代表3列
 5             k= i * 3+j+1
 6             #mp.subplot(231)    #2行3列第一张
 7             mp.subplot(2,3,k)
 8             mp.xticks(())       #不带刻度线
 9             mp.yticks()
10             mp.text(0.5,0.5,str(k),ha='center',va='center',size=36,alpha=0.5)
11 
12 mp.tight_layout()       #紧凑 不空很多格 边距变窄
13 mp.show()
View Code

 

     2.栅格布局

        先建立一个栅格布局器:

          import matplotlib.gridspes as mg

          gs = mg.GridSpes(行数,列数)    <-栅格布局器

          mp.subplot(gs[行,列])

      栅格布局优势:布局均匀

       例:

 1 import matplotlib.pyplot as mp
 2 import matplotlib.gridspec as mg
 3 
 4 
 5 mp.figure(facecolor='lightgray')
 6 gs=mg.GridSpec(3,3)  #生成栅格布局器,3行3列  九宫格
 7 mp.subplot(gs[0,:2])      #gs[0,:2],0代表第0行,:2代表前两例
 8 mp.xticks(())
 9 mp.yticks(())
10 mp.text(0.5,0.5,'1',ha='center',va='center',size=36,alpha=0.5)
11 
12 
13 mp.subplot(gs[1:,0])
14 mp.xticks(())
15 mp.yticks(())
16 mp.text(0.5,0.5,'2',ha='center',va='center',size=36,alpha=0.5)
17 
18 
19 mp.subplot(gs[2,1:])
20 mp.xticks(())
21 mp.yticks(())
22 mp.text(0.5,0.5,'3',ha='center',va='center',size=36,alpha=0.5)
23 
24 
25 mp.tight_layout()
26 mp.show()
View Code

 

     3.自由布局

        mp.axes([左下角水平坐标,左下角垂直坐标,宽度,高度])

        优点:所有尺寸参数都是相对比例

        缺点:同时输入几个,最后一张图能在另一张里面

       例:

 1 import matplotlib.pyplot as mp
 2 
 3 mp.figure(facecolor='lightgray')
 4 mp.axes([0.03,0.038,0.94,0.924])
 5 mp.xticks(())
 6 mp.yticks(())
 7 mp.text(0.5,0.5,'1',ha='center',va='center',size=36,alpha=0.5)
 8 
 9 
10 mp.axes([0.63,0.076,0.31,0.308])
11 mp.xticks(())
12 mp.yticks(())
13 mp.text(0.5,0.5,'2',ha='center',va='center',size=36,alpha=0.5)
14 
15 
16 mp.show()
View Code

 

   2)坐标刻度定位器

       定位器对象=mp.xxLocator(...)

          ax=mp.gca()

       主刻度:ax.xaxis.set_major_locator(定位器对象)#x轴,让定位器对象帮我们定义刻度。

       次刻度:ax.xaxis.set_minor_locator(定位器对象)#x轴,让定位器对象帮我们定义刻度

       locators=[

            'mp.NullLocator()',    #空定位器。不需要参数,可以被解释执行

            'mp.MaxNLocator(nbins=3,steps=[1,3,5,7,9])',  #等分定位器。最多分n段,从后续列表中选一个等分的点

               'mp.FixedLocator(locs=[0,2,5,5,7,5,10])',     #固定定位器。等价于直接调用xticks。
             'mp.AutoLocator()',            #自动定位器。特点:隔间不太密也不太疏,自动匹配
             'mp.IndexLocator(offset=0.5,base=1.5)',  #索引定位器。Offset起始点,base是隔间。
            'mp.MultipleLocator()',          #次刻度定位器。
               'mp.LinearLocator(numticks=21)',     #线性均分定位。如例子,等分20份。
            mp.LogLocator(base=2,subs=[1.0])'    #指数定位器。
            ]

      例:

 1 import numpy as np
 2 import matplotlib.pyplot as mp
 3 
 4 mp.figure()
 5 
 6 locators = [
 7     'mp.NullLocator()',
 8     'mp.MaxNLocator(nbins=3,steps=[1,3,5,7,9])',
 9     'mp.FixedLocator(locs=[0,2.5,5,7.5,10])',
10     'mp.AutoLocator()',
11     'mp.IndexLocator(offset=0.5,base=1.5)',
12     'mp.MultipleLocator()',
13     'mp.LinearLocator(numticks=21)',
14     'mp.LogLocator(base=2,subs=[1.0])']
15 
16 n_locators = len(locators)
17 
18 for i, locator in enumerate(locators):
19     mp.subplot(n_locators,1,i+1)
20     mp.xlim(0,10)
21     mp.ylim(-1,1)
22     mp.yticks(())
23     mp.xticks(())
24     ax = mp.gca()
25     ax.spines['left'].set_color('none')
26     ax.spines['top'].set_color('none')
27     ax.spines['right'].set_color('none')
28     ax.spines['bottom'].set_position(('data',0)) #底轴放中间 因为1到-1,0在中间
29     ax.xaxis.set_major_locator(eval(locator)) #eval函数解释执行 产生类的对象,主刻度执行器
30     ax.xaxis.set_minor_locator(mp.MultipleLocator(0.1))#此刻度定位 0.1为间隔
31     #上面做完但是没有图
32     mp.plot(np.arange(11),np.zeros(11),c='none')  #zeros是全零 y坐标
33     mp.text(5,0.3, locator[3:], ha='center',size=12)
34 
35 
36 mp.tight_layout()
37 mp.show()
View Code

      3.散点图

        散点图的意义:

            可以让一个点附带更多信息。

            总是用两个坐标想,y坐标来表示。

        例子:x代表身高,y代表年龄

          X=np.random.normal(0,     1,         n)这是正态分布规律的随机数     

                    |      |    |

                    V    V    v

                  平均值u  标志差  n个

          u=0

          o=1  代表标准的正太分布

          o  表示标准差  o 值越大就越集中; o值越小瘦高 , o越大越平坦。

          o²方差

          区域填充

          mp.fill_between(水平座标数组,垂直座标数组,垂直座标终点数组,条件,color=颜色,alpha=透明度)

 1 import numpy as np
 2 import matplotlib.pyplot as mp
 3 
 4 n=1000
 5 x=np.linspace(0,8*np.pi,n)#线性分隔
 6 sin_y =np.sin(x)
 7 cos_y=np.cos(x/2)/2     #周期短频率高
 8 
 9 mp.figure('Fill',facecolor='lightgray')
10 mp.title('Fill',fontsize=20)
11 mp.xlabel('x',fontsize=14)
12 mp.ylabel('y',fontsize=14)
13 mp.tick_params(labelsize=10)            #标签文本的字体大小
14 mp.grid(linestyle=':')
15 
16 mp.plot(x,sin_y,c='dodgerblue',label=r'$y=sin(x)$') #线用plot来画
17 mp.plot(x,cos_y,c='orangered',label=r'$y=\frac{1}{2}cos(\frac{x}{2})$')
18 mp.fill_between(x,cos_y,sin_y,cos_y < sin_y,color='dodgerblue',alpha=0.5)
19 mp.fill_between(x,cos_y,sin_y,cos_y > sin_y,color='orangered',alpha=0.5)
20 mp.legend()
21 
22 
23 mp.tight_layout()
24 mp.show()
View Code

      4.柱状图

        mp.bar(水平坐标数组,高度数组,ec=边缘颜色,fc=填充颜色,label=标签文本,alpha=透明度)

        y1=np.random.uniform(0.5,1.0,n)

        在0.5和1.0内产生n个随机数

      例:

 1 import numpy as np
 2 import matplotlib.pyplot as mp
 3 
 4 n=12
 5 x=np.arange(n)  #生成整数数组
 6 y1 =(1-x/n)*np.random.uniform(0.5,1.0,n)
 7 y2 =(1-x/n)*np.random.uniform(0.5,1.0,n)
 8 mp.figure('Bar',facecolor='lightgray')
 9 mp.title('Bar',fontsize=20)
10 mp.ylim(-1.25,1.25)
11 mp.xlabel('x',fontsize=14)
12 mp.ylabel('y',fontsize=14)    #12个数字
13 mp.tick_params(labelsize=10)
14 mp.grid(axis='y',linestyle=':')     #axis='y'   只有水平线的网格
15 
16 for _x,_y in zip(x,y1):
17     #取矩形条的位置和高度
18     #显示文字,两位小数精度的浮点数来表示格式化占位符
19     mp.text(_x,_y,'%.2f'% _y,ha='center',va='bottom')  #块在水平底下
20 
21 
22 for _x, _y in zip(x,y2):
23     #取矩形条的位置和高度
24     #显示文字,两位小数精度的浮点数来表示格式化占位符
25     mp.text(_x, -_y-0.015,'%.2f'% _y,ha='center',va='top')  #块在水平底下
26 
27 mp.bar(x,y1,ec='white',fc='dodgerblue',label='Sample 1')
28 mp.bar(x,-y2,ec='white',fc='dodgerblue',alpha=0.5,label='Sample 2')
29 mp.legend()
30 
31 mp.show()
View Code

 

      5.饼图

        mp.pie(值,间隙,标签,颜色,格式串,shadow=是否带阴影,startangle=起始角度)

       例:

 1 import numpy as np
 2 import matplotlib.pyplot as mp
 3 
 4 valuse=[26,17,21,29,11]
 5 spaces=[0.05,0.01,0.01,0.01,0.01]     #偏移值,每个饼图之间的间距
 6 labels=['Python','JavaScript','C++','Java','PHP']
 7 colors=['dodgerblue','orangered','limegreen','violet','gold']
 8 
 9 mp.figure('Pie',facecolor='lightgray')
10 mp.title('Pie',fontsize=20)
11 mp.pie(valuse,spaces,labels,colors,'%d%%',shadow=True,startangle=90)
12 mp.axis('equal') #等轴比例
13 mp.show()
View Code

 

      6.等高线图

        用途:用二维的图形来展示三维的数据,多用在地理中。

          mp.contour(x,y,z,线数,colors=颜色,linewidth=线宽)    #一根根线

          mp.contourf(x,y,z,线数,cmap=颜色映射)    #一根根色带线(颜色鲜明点)

                  |

                  V

                  N个线数,n个间隔,间隔越多,色带越密集。

          例:

 1 import numpy as np
 2 import matplotlib.pyplot as mp
 3 
 4 n=1000
 5 x,y=np.meshgrid(np.linspace(-3,3,n),np.linspace(-3,3,n))
 6 
 7 #结果是一个空间曲面
 8 z= (1 -x /2+x**5+y**3)*np.exp(-x**2-y**2)
 9 
10 mp.figure('Contour',facecolor='lightgray')
11 mp.title('Contour',fontsize=20)
12 mp.xlabel('x',fontsize=14)
13 mp.ylabel('y',fontsize=14)
14 mp.tick_params(labelsize=10)
15 mp.grid(linestyle=':')
16 #颜色填充等高线
17 mp.contourf(x,y,z,8,cmap='jet')
18 cntr= mp.contour(x,y,z,8,colors='black',linewidths=0.5)
19 
20 mp.clabel(cntr,inline_spacing=1,fmt='%.1f',fontsize=10) #填充数字
21 mp.show()
View Code

 

      meshgrid函数:

        适合于生成网格型数据,它可以接受两个一个数维组生成两个二维矩阵,对应两个数组中所有的(x,y)对。

        meshgrid的作用是 根据传入的两个一维数组参数生成两个数组元素的列表。

      如果第一个参数xarray,维度就是xdimension

      如果第二个参数是yarray,维度就是ydimension

      那么生成第一个二维数组是以xarray作为行,共ydimension行,而第二个二维数组以yarray的转置为列,共xdimension列的向量

      例:

      

 1 #meshgrid
 2 
 3 # 二维坐标,X轴取三个值1,2,3,Y轴取两个值7,8.
 4 #思考:可以获得几个点的坐标
 5 #6个坐标点
 6 #(1,7)(2,7)(3,7)
 7 #(1,8)(2,8)(3,8)
 8 
 9 import numpy as np
10 #坐标向量a
11 a=np.array([1,2,3])
12 #坐标向量b
13 b=np.array([7,8])
14 
15 #从坐标中量中返回坐标矩阵
16 #返回一个list,第一个元素就是x轴的取值,第二个元素是y轴的取值
17 res=np.meshgrid(a,b)
18 print(res)
19 
20 
21 a2=np.arange(4)
22 b2=np.arange(5)
23 
24 
25 datalist=np.meshgrid(a2,b2)
26 # print(datalist)
27 x,y=datalist
28 print(x.shape)
29 print(x)
30 print("*"*123)
31 print(y)
View Code

 

      返回结果:

          第一个二维数组是:以xarray作为行,共ydimension行的向量:

            [[0 1 2 3]
            [0 1 2 3]
            [0 1 2 3]
            [0 1 2 3]
            [0 1 2 3]]

          第为个二维数组是:以yarray作为行,共xdimension行的向量:

            [[0 0 0 0]
            [1 1 1 1]
            [2 2 2 2]
            [3 3 3 3]
            [4 4 4 4]]

       

      7.热像图:

          mp.imshow(矩阵,cmap=颜色映射,origin=确定y轴方向

        例:

 1 import numpy as np
 2 import matplotlib.pyplot as mp
 3 
 4 n=1000
 5 x,y=np.meshgrid(np.linspace(-3,3,n),np.linspace(-3,3,n))
 6 
 7 #结果是一个空间曲面
 8 z= (1 -x /2+x**5+y**3)*np.exp(-x**2-y**2)
 9 
10 mp.figure('Hot',facecolor='lightgray')
11 mp.title('Hot',fontsize=20)
12 mp.xlabel('x',fontsize=14)
13 mp.ylabel('y',fontsize=14)
14 mp.tick_params(labelsize=10)
15 mp.grid(linestyle=':')
16 
17 mp.imshow(z,cmap='jet',origin='low')    #origin是上下颠倒的顺序(没什么必要)
18 mp.show()
View Code

      

      8.三维曲面图:

          主要指:三维贴面和三维线框

          引入库:

              from mpl_toolkits.mplot3d import axes3d

              ax= mp.gca(projection='3d')    #创建三维效果的坐标轴

              ax.plot_surface(x,y,z,rstride=行距,cstride=列距,cmap=颜色映射)

              ax.plot_wireframe(x,y,z,rstride=行距,cstride=列距,linewidth=线宽,cmap=颜色映射)

         例:

 1 from mpl_toolkits.mplot3d import axes3d
 2 import numpy as np
 3 import matplotlib.pyplot as mp
 4 
 5 n=1000
 6 x,y=np.meshgrid(np.linspace(-3,3,n),np.linspace(-3,3,n))
 7 
 8 #结果是一个空间曲面
 9 z= (1 -x /2+x**5+y**3)*np.exp(-x**2-y**2)
10 
11 mp.figure('3d Wireframe')
12 ax = mp.gca(projection='3d')    #生成ax 3d对象
13 mp.title('3d Wireframe',fontsize=20)
14 #3d图里不能再用mp画标签,mp是2d的
15 ax.set_xlabel('x', fontsize=14)
16 ax.set_ylabel('y', fontsize=14)
17 ax.set_zlabel('z', fontsize=14)
18 mp.tick_params(labelsize=10)
19 ax.plot_wireframe(x,y,z,rstride=30,cstride=30,linewidth=0.5,color='orangered')
20 #ax.plot_wireframe(x,y,z,rstride=30,cstride=30,cmap='jet')
21 mp.show()
View Code

      

      9.三维三点图:

          from mpl_toolkits.mplot3d import axes3d

          ax=mp.gca(projection='3d')    #创建三维效果的坐标轴

          ax.scatter(x,y,z,s=大小,c=颜色,marker=点型)

        例:

        

 1 from mpl_toolkits.mplot3d import axes3d
 2 import numpy as np
 3 import matplotlib.pyplot as mp
 4 
 5 n=1500
 6 x=np.random.normal(0,1,n)
 7 y=np.random.normal(0,1,n)
 8 z=np.random.normal(0,1,n)
 9 d=np.sqrt( x **2+y**2+z**2)     #距离正下方的点 空间原点距离
10 
11 mp.figure('Scatter3D')
12 ax = mp.gca(projection='3d')    #生成ax 3d对象
13 mp.title('Scatter3D',fontsize=20)
14 #3d图里不能再用mp画标签,mp是2d的
15 ax.set_xlabel('x', fontsize=14)
16 ax.set_ylabel('y', fontsize=14)
17 ax.set_zlabel('z', fontsize=14)
18 mp.tick_params(labelsize=10)    #标签文本的字体
19 
20 ax.scatter(x,y,z,s=60,c=d,cmap='jet_r',alpha=0.5,marker='*')   #用距离来做颜色,cmap颜色映射,颜色就和距离对应起来
21 #jet_c 0对应深红,最大值对应深蓝;marker='*' 五角星 marker="s"方块,marker="D"菱形
22 mp.show()
View Code

    

      10.极坐标系

          ax=mp.gca(Projection='Polar')    #二维

          mp.plot...(画曲线)

          mp.scatter...

        x,y(x代表极角,y代表极径)

 

         六元回归线  六片花瓣

          六元回归线 表达由线尺寸和角度尺寸之间的函数关系 比较容易角度作极角,线性尺寸作极径。它往往是一个简单的线性方程,使整个操作个能简单化。

        例:

    

 1 from mpl_toolkits.mplot3d import axes3d
 2 import numpy as np
 3 import matplotlib.pyplot as mp
 4 
 5 t = np.linspace(0,2 * np.pi,1001)#线性等分  0,2pi 一圈
 6 r_spiral=0.8*t #螺旋线方程
 7 r_rose=5*np.sin(6*t)#玫瑰线   六元回归线    六瓣
 8 mp.figure('Polar',facecolor='lightgray')
 9 mp.gca(projection='polar')
10 mp.title('Polar',fontsize=20)
11 mp.xlabel(r'$\theta$',fontsize=14)
12 mp.ylabel(r'$\rho$',fontsize=14)
13 mp.tick_params(labelsize=10)        #标签文本的字体
14 mp.grid(linestyle=':')
15 mp.plot(t,r_spiral,c='dodgerblue',label=r'$\rho=0.8\theta$')
16 
17 mp.plot(t,r_rose,c='orangered',label=r'$\rho=5sin(6\theta)$')
18 mp.legend()
19 mp.show()
View Code

 

      11.简单动画

          引入库:import matplotlib.animation as ma

          1.第一种方式:给定一个函数,自己不调取,让别人调取

          Eg.:def 更新函数(顺序号):  #()这个函数不调取;这步完成一个图像生成器,按照一定的频率去刷新显示。每刷新一次,图形变化一次,产生动画效果)

              更新画面帧     #给FuncAnimation调取

            ma.FuncAnimation(图形对象,更新函数,interval=间隔时间(毫秒),)

            #作用:每间隔多少毫秒,就会调取这个更新函数。

            注:一定要绑定anim = ma.FuncAnimation(mp.gcf(),update,interval=10)

        例:

 1 import numpy as np
 2 import matplotlib.pyplot as mp
 3 import matplotlib.animation as ma
 4 
 5 n_bubbles=100
 6 #自定义结构 每个数组就是每个气泡(气泡数组)
 7 #dtype自定义符合结构
 8 bubbles = np.zeros(n_bubbles,dtype=[
 9                                     ('position',float, 2),
10                                     ('size',float,1),
11                                     ('growth',float,1),
12                                     ('color',float,4)])
13 #初始化位置数组
14 #np.random.uniform均匀分布随机数(最小值)
15 bubbles['position']=np.random.uniform(0,1,(n_bubbles,2))
16 bubbles['size']=np.random.uniform(50,750,n_bubbles)
17 bubbles['growth']=np.random.uniform(30,150,n_bubbles)
18 bubbles['color']=np.random.uniform(0,1,(n_bubbles,4))
19 mp.figure('Bubbles',facecolor='lightgray')
20 mp.title('Bubbles',fontsize=20)
21 mp.xticks(())
22 mp.yticks(())
23 #用散点图画
24 #x轴:bubbles['position'][:,0];y轴:bubbles['position'][:,1],
25 #不能用s=数值,这么写所有气泡都一个大小了。
26 sc = mp.scatter(bubbles['position'][:,0],
27            bubbles['position'][:,1],
28            s=bubbles['size'],
29            c=bubbles['color'])
30 def update(number):
31     bubbles['size'] += bubbles['growth']
32     #气泡破裂方法
33     #根据number数,让不同的气泡发生破裂。
34     #变成0-99之间的循环 做取余运算 让下标总是合理
35     burst = number % n_bubbles
36     bubbles['position'][burst] = np.random.uniform(0, 1, 2)
37     bubbles['size'][burst] = 0 #初始大小等于0
38     bubbles['growth'][burst] = np.random.uniform(30,150) #更新膨胀速度
39     bubbles['color'][burst] = np.random.uniform(0, 1, 4)
40     #修改位置的值
41     sc.set_offsets(bubbles['position'])
42     #修改颜色 ,破裂效果产生了
43     sc.set_facecolor(bubbles['color'])
44 
45     sc.set_sizes(bubbles['size'])
46     #修改size里的值
47     sc.set_sizes(bubbles['size'])
48 anim = ma.FuncAnimation(mp.gcf(),update,interval=10)
49 mp.show()
View Code

 

          2.第二种方式:多加一个生成器,把这个生成器当作一个可迭代对象取迭代。迭代中不断生成数据作为参数来调用。通过第二个函数传入的更新函数,由它完成渲染。通过一个函数产生的数据,另一个函数渲染数据,从设计结构上更合理,符合低耦合的设计原则。

       低耦合的设计原则。

          写法:

              def 更新函数(生成值):

                  更新画面帧

              def 生成器():

                for XXX in YYY:

                  产生新数据

                  yield生成值

              ma.FuncAnimation(图形对象,更新函数,生成器,interval=间隔时间)

         实时信号产生动画:

            代码:

 1 import numpy as np
 2 import matplotlib.pyplot as mp
 3 import matplotlib.animation as ma
 4 
 5 
 6 mp.figure('Signal',facecolor='lightgray')      #创建图形窗口
 7 mp.title('Signal',fontsize=20)
 8 mp.xlabel('Time',fontsize=14)       #水平轴x轴代表时间
 9 mp.ylabel('Signal',fontsize=14)     #垂直轴y轴代表信号值
10 #设置水平轴和垂直轴的坐标范围
11 
12 ax=mp.gca()     #当前轴
13 ax.set_ylim(-3,3)   #设置y轴坐标范围
14 ax.set_xlim(0,10)   #设置x轴坐标范围
15 mp.tick_params(labelsize=10)        #设置坐标刻度的字体
16 mp.grid(linestyle=':')      #加上网格线
17 
18 #mp.show#生成空的图片
19 p1= mp.plot([],[],c='orangered')[0]     #封装p1,必须拿最第0个元素
20 p1.set_data([],[])  #把x,y空数组对象保存起来
21 
22 #data存的是数据,我们自己第一
23 def update(data):
24     #data里放的是时间和信息
25     #t,v是我新加点的坐标
26     t,v=data
27     x,y=p1.get_data()
28     x.append(t)     #在现有坐标后面加上新的,做追加
29     y.append(v)
30     x_min,x_max=ax.get_xlim()   #左右边界
31     if t >= x_max:
32         ax.set_xlim(t-(x_max-x_min),t)
33         #把新的t当做最大值,就是新范围
34         ax.figure.canvas.draw()     #重新画
35 
36 
37     #告诉x,y我改了
38     p1.set_data(x,y)
39     #接下来写生成器函数
40 def generator():
41     t=0     #时间容器,代表信号采集时间
42     while True:
43         #模拟  np.exp代表振幅
44         #振幅呈正归位变化的正弦函数
45         #np.sin(2**np.pi*t)高频信号;
46         #np.sin(0.2*np.pi*t)低频信号
47         v=np.sin(2**np.pi*t) *np.exp(np.sin(0.2*np.pi*t))
48 
49 
50         #yield会把当前的帧保存下来
51         yield t,v
52         t+=0.05
53 
54 anim=ma.FuncAnimation(mp.gcf(),update,generator,interval=5)
55 mp.show()
View Code

 

        12.对数坐标

            对数:值越小,放大的尺寸越大;

               值越大,放大的尺寸越小。

            我们称为非线性特征。

            对数体现出了倍数。

            半对数坐标:

              mp.semilog(y,c=颜色,label="semilog")

            为什么用对数:

                等分坐标的缺点:当尺寸相差比较悬殊的时候。往往大尺寸变化率会把小尺寸变换率淹没了。

                例:y值 1-1000小于1的几乎看不出区别。

          例:

 1 import numpy as np
 2 import matplotlib.pyplot as mp
 3 y = np.array([1, 10, 100, 1000, 100, 10, 1])
 4 mp.figure('Normal & Log', facecolor='lightgray')
 5 mp.subplot(211)
 6 mp.title('Normal', fontsize=16)
 7 mp.ylabel('y', fontsize=12)
 8 ax = mp.gca()
 9 ax.xaxis.set_major_locator(
10         mp.MultipleLocator(1))
11 #多点定位器,主刻度间隔1
12 ax.xaxis.set_minor_locator(
13         mp.MultipleLocator(0.1))
14 
15 ax.yaxis.set_major_locator(
16         mp.MultipleLocator(250))
17 
18 ax.yaxis.set_minor_locator(
19         mp.MultipleLocator(50))
20 mp.tick_params(labelsize=10)
21 #沿着主刻度来画标线
22 mp.grid(which='major',axis='both',
23         linewidth=0.75,linestyle='-',
24         color='lightgray')
25 mp.grid(which='minor',axis='both',
26         linewidth=0.25,linestyle='-',
27         color='lightgray')
28 mp.plot(y, 'o-', c='dodgerblue', label='plot')
29 mp.legend()
30 
31 mp.subplot(212)
32 mp.title('Log', fontsize=16)
33 mp.xlabel('x', fontsize=12)
34 mp.ylabel('y', fontsize=12)
35 ax = mp.gca()
36 ax.xaxis.set_major_locator(
37         mp.MultipleLocator(1))
38 #多点定位器,主刻度间隔1
39 ax.xaxis.set_minor_locator(
40         mp.MultipleLocator(0.1))
41 
42 mp.tick_params(labelsize=10)
43 #沿着主刻度来画标线
44 mp.grid(which='major',axis='both',
45         linewidth=0.75,linestyle='-',
46         color='lightgray')
47 mp.grid(which='minor',axis='both',
48         linewidth=0.25,linestyle='-',
49         color='lightgray')
50 
51 mp.semilogy(y, 'o-', c='orangered',
52             label='semilog')
53 mp.legend()
54 
55 mp.tight_layout()
56 mp.show()
View Code

 

转载于:https://www.cnblogs.com/AloneDKN/p/11466119.html

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值