Matplotlib

                                                                                                                                               点击此处返回总目录

 

参考:https://www.jianshu.com/p/aa4150cf6c7f

           https://blog.csdn.net/Jinlong_Xu/article/details/67646094

           https://blog.csdn.net/luanpeng825485697/article/details/78508819

           https://www.jb51.net/article/130617.htm

 

一、Matplotlib简介

二、改变线条的粗细颜色外观

       增加图例、标题、标签等各种属性

       设置坐标轴取值范围、含义定制

三、一个图上画多条线

       一个窗口画多个图

       画多个窗口

四、散点图                        plt.scatter()

五、条形图                        plt.bar()

六、直方图                        plt.hist()

七、饼图                            plt.pie()

八、等高线图                     plt.contour()、plt.contourf()

 

 

一、Matplotlib简介

Matplotlib 是 Python 的一个绘图库。

 

1.导入:

import matplotlib.pyplot as plt

二、图例、标题和标签

我们通过实验一步一步来讲解,

 

实验一,首先画一条折线

import matplotlib.pyplot as plt

 

x=[1,2,3]
y=[3,1,1]

 

plt.plot(x,y)                       #.plot()函数用来画折线。
plt.show()                          #用于显示图像。

运行结果如下:

Matplotlib

                           

实验二:改变线条的粗细、颜色等外观。

import matplotlib.pyplot as plt

 

x=[1,2,3]
y=[3,1,1]

 

plt.plot(x,y,'r^--',lw=1)     //“r”表示红色,“^”代表三角,“--”表示虚线 ,lw=1表示粗细,也可以写为linewidth=1。
plt.show()

 

结果如下:

                     Matplotlib

【总结】

颜色有:

       蓝色  b          绿色  g           红色  r            青色  c 

       品红  m         黄色  y           黑色  k            白色  w

 

常用点标记: 

       点  .             像素  ,            圆  o               方形  s              三角形  ^

 

线条有:

      直线  -          虚线  --          点线  :           点划线  -.

 

属性:

linewidth  lw                  //线条的粗细

alpha                            //透明度。

 

实验三,给图形添加标题、图例、坐标轴标签

import matplotlib.pyplot as plt

x=[1,2,3]
y=[3,1,1]

 

plt.plot(x,y,'r^--',label='liu')      #label参数就是为线条指定名称,后面可以显示在图例中

plt.title('a line')                       #添加标题
plt.legend()                            #展示图例
plt.xlabel('x')                           #给x轴起名字
plt.ylabel('y')                          #给y轴起名字


plt.show()

运行结果:

                    Matplotlib

实验四,设置坐标轴取值范围

import matplotlib.pyplot as plt

x=[1,2,3]
y=[3,1,1]

 

plt.plot(x,y,'r^--',label='liu')

 

plt.title('a line')
plt.legend()
plt.xlabel('x')
plt.ylabel('y')

 

plt.xlim((0.5,3.1))                    #设置x轴的取值范围
plt.ylim((0.5,3.1))                   #设置y轴的取值范围

 

plt.show()

运行结果:

                    Matplotlib

 

实验五、对坐标轴的含义进行定制

 

为了更好的表示横轴和纵轴数据的含义,可以通过ticks对横轴和纵轴的含义进行设置和定制。

import matplotlib.pyplot as plt
import numpy as np

 

x=np.linspace(-2*np.pi,2*np.pi,50)
y=np.sin(x)

 

plt.plot(x,y,'r^--',label='sinx')

 

plt.title('a line')
plt.legend()
plt.xlabel('x')
plt.ylabel('y')

 

plt.xlim(-np.pi*1.1,np.pi*1.1)
plt.xticks([-np.pi,-np.pi/2,0,np.pi/2,np.pi],                          #x轴在这5个点的地方分别显示下面的内容。
              [r'$-\pi$',r'$-\pi/2$',r'$0$',r'$\pi/2$',r'$\pi$'])

plt.ylim(-1*1.1,1*1.1)
plt.yticks([-1,0,1],
               [r'$-1$',r'$0$',r'$1$'])

 

plt.show()

运行结果:

Matplotlib

 

若上面的代码不加两个ticks语句,则显示内容如下:

Matplotlib

 

如果不想要把x轴y轴的刻度都去掉。可以用以下语句:

plt.xticks(())

plt.yticks(())

 

三、如何绘制多个图。(fiture、axes、axis的关系)

 

实验一,在一个图上画两条线。再画一条sin函数的线。

import matplotlib.pyplot as plt
import numpy as np                              #下面的函数用到了np库

x=[1,2,3]
y=[3,1,1]

z=np.linspace(0,2*np.pi,20)                  #生成20个数的等差数列。含有0和2pi。
r=np.sin(z)

 

plt.plot(x,y,'r^--',label='liu')     #label参数就是为线条指定名称,后面可以显示在图例中
plt.plot(z,r,'bo:',label='li')       #蓝色、圆、电线。

 

plt.title('two lines')      #添加标题
plt.legend()                #展示图例
plt.xlabel('x')              #给x轴起名字
plt.ylabel('y')              #给y轴起名字


plt.show()

运行结果:

                 Matplotlib

 

实验二:在一个窗口里面画多张图。把上面的两条线分到两张图里面。

刚才是在一个图上画多条线,现在是把不同的线画在不同的图上。

import matplotlib.pyplot as plt
import numpy as np

 

x=[1,2,3]
y=[3,1,1]

z=np.linspace(0,2*np.pi,20)
r=np.sin(z)

 

plt.subplot(2,1,1)
plt.plot(x,y,'r^--')

 

plt.subplot(2,1,2)
plt.plot(z,r,'bo:')

 

plt.show()

运行结果:

                    Matplotlib

 

总结:使用子图只需要一个额外的步骤,就可以像前面的例子一样画图。即,在调用plot()之前需要先调用subplot()函数。该函数第一个参数代表子图的总行数,第二个参数代表子图的总列数,第三个参数代表活跃区域。

比如,画6个图:

import matplotlib.pyplot as plt
import numpy as np

 

x=[1,2,3]
y=[3,1,1]

z=np.linspace(0,2*np.pi,20)
r=np.sin(z)

 

plt.subplot(2,3,2)                   #行、列、活跃区
plt.plot(x,y,'r^--',label='liu')     
plt.title('first picture')           
plt.legend()                          
plt.xlabel('x')                       
plt.ylabel('y')          

 

plt.subplot(2,3,4)                    #第4个图
plt.plot(z,r,'y-')

 

plt.subplot(2,3,6)                    #第6个图

 

plt.show()

运行结果:

                      Matplotlib

更高级一点的,使用plot2grid()函数将窗口随意划分,

 

import matplotlib.pyplot as plt
import numpy as np

plt.subplot2grid((3,3),(0,0),colspan=3)       #划分为3*3,当前为0*0格,选定3行。

 

plt.subplot2grid((3,3),(1,0),colspan=2)       #划分为3*3,当前为1*2格,选定2行。

 

plt.subplot2grid((3,3),(1,2),rowspan=2)      #划分为3*3,当前为1*2格,选定2列。

 

plt.subplot2grid((3,3),(2,1))                        #划分为3*3,当前为2*2格。

 

plt.show()

运行结果:

Matplotlib

 

 

实验三,画不同的的figure,再在其中画图。

实验二中可以画不同的图了,但是呢他们都在同一个figure中。所以可不可以画多个figure呢?

 

import matplotlib.pyplot as plt
import numpy as np

x=[1,2,3]
y=[3,1,1]

z=np.linspace(0,2*np.pi,20)
r=np.sin(z)


plt.plot(x,y,'r^--')                                     #这个图默认画在figure1中。也可以在这句话前面加上语句plt.figure()。

 

plt.figure()                                             #执行这句话,将新建一个figure。
plt.plot(z,r,'bo:')

 

plt.show()

运行结果:

           Matplotlib   Matplotlib

 

说明一下各个关系:

figure              就是窗口。

axex                轴域,为axix字母的复试,就是子图。

axix                 轴

                   Matplotlib

 

例:

import matplotlib.pyplot as plt
import numpy as np

x=[1,2,3]
y=[3,1,1]

z=np.linspace(0,2*np.pi,20)
r=np.sin(z)

 

plt.figure()                                         #第一个figure
plt.plot(x,y,'r^--')

 

plt.figure()                                         #第二个figure

plt.subplot(2,2,1)                                       #第一个axex(轴域)
plt.plot(z,r,'bo:')

plt.subplot(2,2,4)                                       #第4个轴域
plt.plot(x,x,'ks-',)
plt.plot(x,y,'y.-.')

plt.show()

Matplotlib Matplotlib

 

还可以指定figure的名字、大小等。

import matplotlib.pyplot as plt
import numpy as np

 

x=[1,2,3]
y=[3,1,1]

z=np.linspace(0,2*np.pi,20)
r=np.sin(z)

plt.plot(x,y,'r^--')

 

plt.figure(num=4,figsize=(3,1))               #设置窗口的名字,大小。
plt.plot(z,r,'bo:')

 

plt.show()

 

运行结果:

Matplotlib

 

 

 

 

四、散点图

import matplotlib.pyplot as plt
import numpy as np

 

x=np.arange(10)
y=x**2

 

plt.scatter(x,y,color='red')                  #用plt.plot()函数也能达到相同的效果。

plt.show()

运行结果:

                  Matplotlib

再比如,

import matplotlib.pyplot as plt
import numpy as np

plt.plot(10*np.random.randn(100),10*np.random.randn(100),'bo')
plt.show()

运行结果:

Matplotlib

 

五、柱状图(条形图)   plt.bar()

 

import matplotlib.pyplot as plt

 

x=[1,5,3,6]
y=[3,2,1,7]

 

plt.bar(x,y,0.9,alpha=0.5,color='b')        #alpha为透明度。0.9代表宽度。
plt.show()

运行结果:

                  Matplotlib

 

 

六、直方图 plt.hist()

直方图非常像条形图。会将数据放到各个组区间里。

 

比如,

import matplotlib.pyplot as plt

 

x=[10,12,32,22,24,25,28,8,40,45]                   

bins = [0,10,20,30,40,50,60]                            #区间划分。有6个区间,所以有6个柱子。

plt.hist(x,bins,histtype='bar',rwidth=0.98)         #x为数据。第二个参数还可以直接写数字,为直方图的个数。rwidth为柱子的宽度。

plt.xlabel('age')
plt.ylabel('num')
plt.title('nums of age group')

plt.show()

运行结果:

                 Matplotlib

分析:x为数据,有[0,10)有一个,[10,20)有两个,[20,30)有4个,[30,40)有1个,[40,50)有2个,[50,60)有0个。

          

再比如,

import matplotlib.pyplot as plt
import numpy as np

 

np.random.seed(1)
mu,sigma=100,20                                             #均值和标准差
x=np.random.normal(mu,sigma,size=20)

print(x)

 

plt.hist(x,5,histtype='bar',rwidth=0.95)               #将从最小到最大的数分成5个相等的区间。然后显示5个柱子显示每个区间的个数。

plt.show()

运行结果:

[132.48690727  87.76487173  89.43656495  78.54062756 117.30815259
  53.96922606 134.89623528  84.77586198 106.38078192  95.01259249
 129.24215874  58.79718581  93.55165592  92.31891291 122.67538885
  78.00217465  96.55143585  82.44283164 100.84427493 111.65630427]

              Matplotlib

 

七、饼图

import matplotlib.pyplot as plt

x=[9,10,2,3]
y=['sleeping','working','sporting','else']
cols=['b','r','y','g']

 

plt.pie(x,labels=y,colors=cols,
        startangle=90,                            #从90度的地方开始画。
        shadow=True,                             #为false表示二维饼图,true表示为三维饼图
        explode=(0,0.05,0,0)                  #共有4个部分,想让哪一部分突出来就写一个非零值。数值越大突出来的越多。

        autopct='%1.1f%%'                    #显示出百分比

        )

plt.title('a pie')
plt.legend()

plt.show()

运行结果:

                    Matplotlib

此处为椭圆形饼图,若想要圆形可以增加语句: plt.axis(‘equal’)

 

八、等高线图

plt.contour()  函数用来画线

plt.contourf()函数用来填充

 

实验一:单独使用plt.contour()函数画等高线的效果。

import numpy as np
import matplotlib.pyplot as plt


def h(x, y):                                                              #定义x,y坐标对应的高度函数
    return (1-x/2+x**5+y**3) * np.exp(-x**2-y**2) 

 

m,n=200,250
x=np.linspace(-3,3,m)
y=np.linspace(-3,3,n)

 

X,Y=np.meshgrid(x,y)                                                #生成网格数据

 

plt.contour(X,Y,h(X,Y),10)                            #参数:x、y对应的网格数据;高度;2代表的是显示等高线的密集程度,

                                                                    #数值越大,画的等高线数就越多

plt.show()

运行结果:

                    Matplotlib

还可以增加colors='black',linewidths=1等属性改变颜色和线条粗细。注意都要加复数,否则没有效果。很多教程都没有加。

可以看到只有线没有颜色。

 

实验二:单独使用plt.contourf()函数的效果。

import numpy as np
import matplotlib.pyplot as plt


def h(x, y):  
    return (1-x/2+x**5+y**3) * np.exp(-x**2-y**2) 

 

m,n=200,250

x=np.linspace(-3,3,m)
y=np.linspace(-3,3,n)

 

X,Y=np.meshgrid(x,y)

 

plt.contourf(X,Y,h(X,Y),10)                         #单独使用contoutf()函数。

 

plt.show()                

运行结果:

              Matplotlib

可以看到只有颜色填充,没有线。

 

实验三:同时使用contour()、contourf()的效果。

import numpy as np
import matplotlib.pyplot as plt


def h(x, y):  
    return (1-x/2+x**5+y**3) * np.exp(-x**2-y**2) 

 

m,n=200,250
x=np.linspace(-3,3,m)
y=np.linspace(-3,3,n)

 

X,Y=np.meshgrid(x,y)

 

plt.contourf(X,Y,h(X,Y))
plt.contour(X,Y,h(X,Y),10)

 

plt.show()                

运行效果:

                  Matplotlib

 

实验四、改成热力图。

上面的颜色太冷了,想显示热力图,那只要在plt.contourf()函数中添加属性cmap=plt.cm.hot就能显示热力图,其中cmap代表为color map,我们把color map映射成hot(热力图)。

import numpy as np
import matplotlib.pyplot as plt


def h(x, y):  
    return (1-x/2+x**5+y**3) * np.exp(-x**2-y**2) 

 

m,n=200,200
x=np.linspace(-3,3,m)
y=np.linspace(-3,3,n)

 

X,Y=np.meshgrid(x,y)

 

plt.contourf(X,Y,h(X,Y),20,cmap=plt.cm.hot)                     #负责填充颜色。
plt.contour(X,Y,h(X,Y),20,colors='black',linewidths=1)      #负责画线。

 

plt.show()

运行结果:

                Matplotlib

使用了颜色之后,虚线代表负的,实线代表正的。

 

实验五、在等高线上增加标注

import numpy as np
import matplotlib.pyplot as plt


def h(x, y):  
    return (1-x/2+x**5+y**3) * np.exp(-x**2-y**2) 

 

m,n=200,200
x=np.linspace(-3,3,m)
y=np.linspace(-3,3,n)

 

X,Y=np.meshgrid(x,y)                                                         #生成网格数据。

 

plt.contourf(X,Y,h(X,Y),20,cmap=plt.cm.hot)                       #填充
C=plt.contour(X,Y,h(X,Y),20,colors='black',linewidths=1)   #画线
plt.clabel(C,inline=True,fontsize=12)                                 #标注

 

plt.show()

运行结果:

              Matplotlib