点击此处返回总目录
参考:https://www.jianshu.com/p/aa4150cf6c7f
https://blog.****.net/Jinlong_Xu/article/details/67646094
https://blog.****.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() #用于显示图像。
|
运行结果如下:

实验二:改变线条的粗细、颜色等外观。
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()
|
结果如下:

【总结】
颜色有:
蓝色 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()
|
运行结果:

实验四,设置坐标轴取值范围
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()
|
运行结果:

实验五、对坐标轴的含义进行定制
为了更好的表示横轴和纵轴数据的含义,可以通过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()
|
运行结果:

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

如果不想要把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()
|
运行结果:

实验二:在一个窗口里面画多张图。把上面的两条线分到两张图里面。
刚才是在一个图上画多条线,现在是把不同的线画在不同的图上。
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()
|
运行结果:

总结:使用子图只需要一个额外的步骤,就可以像前面的例子一样画图。即,在调用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()
|
运行结果:

更高级一点的,使用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()
|
运行结果:

实验三,画不同的的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()
|
运行结果:

说明一下各个关系:
figure 就是窗口。
axex 轴域,为axix字母的复试,就是子图。
axix 轴

例:
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()
|

还可以指定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()
|
运行结果:

四、散点图
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()
|
运行结果:

再比如,
import matplotlib.pyplot as plt
import numpy as np
plt.plot(10*np.random.randn(100),10*np.random.randn(100),'bo')
plt.show()
|
运行结果:

五、柱状图(条形图) 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()
|
运行结果:

六、直方图 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()
|
运行结果:

分析: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]

七、饼图
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()
|
运行结果:

此处为椭圆形饼图,若想要圆形可以增加语句: 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()
|
运行结果:

还可以增加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()
|
运行结果:

可以看到只有颜色填充,没有线。
实验三:同时使用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()
|
运行效果:

实验四、改成热力图。
上面的颜色太冷了,想显示热力图,那只要在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()
|
运行结果:

使用了颜色之后,虚线代表负的,实线代表正的。
实验五、在等高线上增加标注
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()
|
运行结果:

|