赞
踩
目录
如Matplotlib名字一般,Matplotlib是模仿MATLAB中plot绘图函数的一个library(库),它拥有MATLAB绘图的基本所有功能,同时还拥有许多自己特有DIY操作。
Matplotlib是建立在NumPy数组上的多平台数据可视化的库,期初是为了更好的与SciPy堆栈一起工作使用。
目前基于Matplotlib构建的新包也是层出不穷,例如Seaborn,ggplot,Altair,甚至是Pandas本身也可以作为Matplotlib的包装器,但是即使是使用这些包装器,对Matplotlib的学习也是很有必要的。
本文章主要通过实例的展示,对Matplotlib的功能做一个入门的介绍。
既然是绘图工具包,那么首要的功能就是绘图了,我们直接进入主图,通过上面的介绍我们已经知道了,Matplotlib是模仿MATLAB的包,如果对MATLAB熟悉的小伙伴就会知道,plot的用法。正如MATLAB中的plot一样,Matplotlib也可以这样直接绘图。
- import matplotlib.pyplot as plt
- import numpy as np
-
- x=np.linspace(0,10,100)
- fig=plt.figure()#创建一张图片
- plt.plot(x,np.sin(x),'-')#使用实线绘出sin
- plt.plot(x,np.cos(x),'--')#使用虚线绘出cos
- import matplotlib.pyplot as plt
- import numpy as np
-
- x=np.linspace(0,10,100)
- fig=plt.figure()#创建一张图片
- plt.plot(x,np.sin(x),'-')#使用实线绘出sin
- plt.plot(x,np.cos(x),'--')#使用虚线绘出cos
-
- fig.savefig('这是一张图片.jpg',dpi=300, bbox_inches = 'tight')#保存图片
这样就保存好一张图片了,同时我们可以通过设置dpi的大小来改变保存的清晰度,以及bbox_inches 来设置是否要保存图片的所有部分,包括不可见的部分。
如果你觉得颜色过于单调了,想要自己选择颜色,那么可以使用color这个这个属性
- import matplotlib.pyplot as plt
- import numpy as np
-
- x=np.linspace(0,10,100)
-
- colors=['blue',#名称
- 'r',#简称
- '0.75',#灰度值[0-1]
- '#FFDD44',#十六进制
- (1.0,0.2,0.6),#RGB[0-1]
- 'chartreuse']#颜色全称
- for i ,c in enumerate(colors):
- plt.plot(x,np.sin(x-i),color=c)
如果觉得线条样式太过单一,你可以使用单引号加点和线段的组合表示线条类型
- import matplotlib.pyplot as plt
- import numpy as np
-
- x=np.linspace(0,10,100)
- codes=['-g','--c','-.k',':r']
- for i,code in enumerate(codes):
- plt.plot(x,x+i,code)
也可以新增线段的标记点
- import matplotlib.pyplot as plt
- import numpy as np
-
- x=np.linspace(0,10,100)
- fig=plt.figure()#创建一张图片
- plt.plot(x,np.sin(x),'o-')#使用实线绘出sin
- plt.plot(x,np.cos(x),'ys-')#使用虚线绘出cos
类型 | 标记符 | 颜色 | |||
- | 实线 | o | 空心圆 | r | 红色 |
-- | 双划线 | * | 星号 | g | 绿色 |
: | 虚线 | + | 加号 | b | 蓝色 |
:. | 点划线 | ys | 菱形 | m | 洋红色 |
-. | 下划线加点 | x | 交叉符 | c | 青绿色 |
-.. | 下划线加两点 | ^ | 上三角 | y | 黄色 |
< | 左三角 | w | 黑色 | ||
> | 右三角 | k | 白色 | ||
v | 下三角 | ||||
s | 正方形 |
除了线性图,还可以画柱状图
- x=np.linspace(0,10,10)
- y=x
- plt.bar(x,y)
单组不够可以画成多组的
- import numpy as np
- import matplotlib.pyplot as plt
-
- data=abs(np.random.randn(3,4))
- x=np.arange(4)
- fig=plt.figure()
- plt.bar(x + 0.00, data[0], color = 'b', width = 0.25)
- plt.bar(x + 0.25, data[1], color = 'g', width = 0.25)
- plt.bar(x + 0.50, data[2], color = 'r', width = 0.25)
- import numpy as np
- import matplotlib.pyplot as plt
-
- a=np.array([25,21,23,33,15])
- b=np.array([56,23,34,23,11])
- c=np.array([34,89,45,54,12])
-
-
- #绘制堆叠图,主要使用bottom,可以设置柱状图底部的起始位置
- plt.bar(ind, a, width=0.5, color='skyblue',bottom=b+c)
- plt.bar(ind, b, width=0.5, color='lightblue',bottom=c)
- plt.bar(ind, c, width=0.5, color='teal')
现在图也画出来了,是不是觉得缺少点什么,一张标题应该要有它自己的标题跟注解的。那我们将原本的代码稍作修改
- import numpy as np
- import matplotlib.pyplot as plt
-
- x_ticks=['AA','BB','CC','DD','EE']
- a=np.array([25,21,23,33,15])
- b=np.array([56,23,34,23,11])
- c=np.array([34,89,45,54,12])
-
- xspeace=[x for x,a in enumerate(x_ticks)]
-
- #绘制堆叠图,主要使用bottom,可以设置柱状图底部的起始位置
- plt.bar(xspeace, a, width=0.5,label='a', color='skyblue',bottom=b+c)
- plt.bar(xspeace, b, width=0.5,label='b', color='lightblue',bottom=c)
- plt.bar(xspeace, c, width=0.5,label='c', color='teal')
-
- #设置注解
- plt.xticks(xspeace, x_ticks) #x轴横坐标
- plt.ylabel("y lable") #y轴标签
- plt.xlabel("x lable") #x轴标签
- plt.legend(loc="upper right") #标签放置位置
- plt.title("Title")#图片标题
- from matplotlib import pyplot as plt
- import numpy as np
-
- fig=plt.figure()
- Height = ['160', '165', '170', '175', '180']
- Count = [16,17,17,17,18]
- #绘制饼状图
- plt.pie(Count, labels = Height,autopct='%1.2f%%',
- colors=['skyblue','lightblue','teal','azure','cyan'])
使用scatter函数进行绘图,与线的marker一样,散点图也有许多的marker
- from matplotlib import pyplot as plt
- import numpy as np
- rng=np.random.RandomState(seed=0)
- for marker in ['o','.',',','x','+','v','^','<','>','s','p','d']:
- plt.scatter(rng.rand(5),rng.rand(5),marker=marker)
设置可以通过s属性,alpha属性,调整标记的大小和透明度
- from matplotlib import pyplot as plt
- import numpy as np
- rng=np.random.RandomState(seed=0)
- for marker in ['o','.',',','x','+','v','^','<','>','s','p','d']:
- plt.scatter(rng.rand(5),rng.rand(5),s=np.random.randint(500),alpha=np.random.random(),
- marker=marker)
使用boxplot画箱线图,其中,object为箱子数据
- from matplotlib import pyplot as plt
- np.random.seed(10)
- object1 = np.random.normal(100, 10, 200)
- object2 = np.random.normal(90, 20, 200)
- object3 = np.random.normal(80, 30, 200)
- object4 = np.random.normal(70, 40, 200)
- object5 = np.random.normal(60, 50, 200)
-
- DataList=[object1,object2,object3,object4,object5]
- fig = plt.figure()
- plt.boxplot(DataList)
将boxplot改为violinplot则可以画出小提琴图
- from matplotlib import pyplot as plt
- np.random.seed(10)
- object1 = np.random.normal(100, 10, 200)
- object2 = np.random.normal(90, 20, 200)
- object3 = np.random.normal(80, 30, 200)
- object4 = np.random.normal(70, 40, 200)
- object5 = np.random.normal(60, 50, 200)
-
- DataList=[object1,object2,object3,object4,object5]
- fig = plt.figure()
- plt.violinplot(DataList)
有些时候,我们还会遇到需要画等高线的情况
Matplotlib也帮我们预想到了
与Matlab一样,我们可以使用meshgrid与contour结合使用,来绘制等高线图
- import matplotlib.pyplot as plt
- import numpy as np
-
- plt.style.use('seaborn-white')#设置绘画风格
-
- #创建等高线的函数,不需要深度了解
- def f(x,y):
- return np.sin(x)**10+np.cos(10+y*x)+np.cos(x)
-
- x=np.linspace(0,5,50)
- y=np.linspace(0,5,40)
-
- X,Y=np.meshgrid(x,y)#获取网格坐标
- Z=f(X,Y)
-
- plt.contour(X,Y,Z,colors='k')
这边的网格坐标指的是,将X当作坐标系里的x,Y当作坐标系中的y做成的网格点的x,y坐标
可以增加等级跟规格,使其数字可以与颜色对应
- import matplotlib.pyplot as plt
- import numpy as np
-
- plt.style.use('seaborn-white')#设置绘画风格
-
- #创建等高线的函数,不需要深度了解
- def f(x,y):
- return np.sin(x)**10+np.cos(10+y*x)+np.cos(x)
-
- x=np.linspace(0,5,50)
- y=np.linspace(0,5,40)
-
- X,Y=np.meshgrid(x,y)#获取网格坐标
- Z=f(X,Y)
-
- plt.contour(X,Y,Z,levels=20,cmap='RdGy')
使用contourf与colorbar,你就可以得到一个妥妥的热图了
- import matplotlib.pyplot as plt
- import numpy as np
-
- plt.style.use('seaborn-white')#设置绘画风格
-
- #创建等高线的函数,不需要深度了解
- def f(x,y):
- return np.sin(x)**10+np.cos(10+y*x)+np.cos(x)
-
- x=np.linspace(0,5,50)
- y=np.linspace(0,5,40)
-
- X,Y=np.meshgrid(x,y)#获取网格坐标
- Z=f(X,Y)
-
- plt.contourf(Z,levels=20,cmap='RdGy')
- plt.colorbar()
该图可以描述整体的变化趋势,也可以表示单一时刻的波动情况,这边的yfit即为上下限,yfit-dyfit为下限,yfit+dyfit为上限。注意:dyfit的shape需要与yfit的shape大小一致
- import matplotlib.pyplot as plt
- import numpy as np
-
-
- xfit=np.linspace(0,10,100)
- yfit=np.cos(xfit)
-
- plt.plot(xfit,yfit,'-',color='gray')
-
- dyfit=np.random.random(100)
-
- plt.fill_between(xfit,yfit-dyfit,yfit+dyfit,color='gray',alpha=0.2)
我们先前所讲的绘图方式都是模仿MATLAB的绘图方式,使用plot直接进行绘图。但实际上,matplotlib有为我们提供另一种绘图方式,是绘图可以更加的灵活和丰富。
如果之前是将整个图片当成一个画板的画,这种形式则更想figure是一面墙,而我们可以在墙上的一个区域挂上一幅画进行绘制。
废话不多说,我们直接进入实例。
- import matplotlib.pyplot as plt
- import numpy as np
- x = np.arange(0, np.math.pi*2, 0.05)
- y = np.sin(x)
- #接下来我们不直接画图,我们创建一个plt的subplots对象,里面包含一张6*6大小的图片
- #且该图片充满整个plt的控件。既1行1列个图片,背景颜色设置为白色,清晰度为300
- fig,axs=plt.subplots(1,1,figsize=(5,5),facecolor='white',dpi=300)
- axs.plot(x,y)
- #同样的,我们可以设置它的标题,横轴、纵轴的标题
- axs.set_xlabel('angle')
- axs.set_ylabel('sine')
- axs.set_title("sine wave",fontdict = {'fontsize' : 20,'fontstyle' : 'oblique',
- 'color':'red','fontfamily': 'fantasy'},loc='left')
通过这种形式的编写,我们可以形成画中画的效果
- import matplotlib.pyplot as plt
- import numpy as np
- import math
- x = np.arange(0, math.pi*2, 0.05)
- fig=plt.figure()
- axes1=fig.add_axes([0.1,0.1,0.8,0.8])
- axes2 = fig.add_axes([0.55, 0.55, 0.3, 0.3]) # inset axes
- y=np.sin(x)
- axes1.plot(x,y)
- axes2.plot(x,np.cos(x),'--r')
- axes1.set_title('sine')
- axes2.set_title("cosine")
- axes1.set_xlabel("Angle",loc='left')
- plt.show()
可以形成多画并行的效果
- import matplotlib.pyplot as plt
- #该图中有两行两列图片,所以使用的为2,2
- fig,a = plt.subplots(2,2,figsize=(5,5),facecolor='white',dpi=300)
- import numpy as np
- x = np.arange(1,5)
- #绘制平方函数
- a[0][0].plot(x,x*x)
- a[0][0].set_title('square')
- #绘制平方根图像
- a[0][1].plot(x,np.sqrt(x))
- a[0][1].set_title('square root')
- #绘制指数函数
- a[1][0].plot(x,np.exp(x))
- a[1][0].set_title('exp')
- #绘制对数函数
- a[1][1].plot(x,np.log10(x))
- a[1][1].set_title('log')
- plt.show()
还可以通过subplot2grid来分配各个图的大小
- import matplotlib.pyplot as plt
- a1=plt.subplot2grid((3,3),(0,0),colspan=2)
- a2 = plt.subplot2grid((3,3),(0,2), rowspan = 3)
- a3 = plt.subplot2grid((3,3),(1,0),rowspan = 2, colspan = 2)
- import numpy as np
- x = np.arange(1,10)
- a2.plot(x, x*x)
- a2.set_title('square')
- a1.plot(x, np.exp(x))
- a1.set_title('exp')
- a3.plot(x, np.log(x))
- a3.set_title('log')
- plt.tight_layout()
- plt.show()
这边仅仅举例一个线性图的例子,之前所诉的绘图也均可使用该方式绘图,函数会有些许不同,不再做举例。
引入面对对象的方式,主要是这可以让我们在3D绘图中显得更加的得心应手。
- from mpl_toolkits import mplot3d
- import numpy as np
- import matplotlib.pyplot as plt
- fig = plt.figure()
- ax = plt.axes(projection='3d')
通过projection属性的更改,就可以发现,画布有之前的2D变成了3D
转至3D界面后,就可以使用scatter3D函数绘制3D散点图了
- from mpl_toolkits import mplot3d
- import numpy as np
- import matplotlib.pyplot as plt
- fig=plt.figure()
- ax=plt.axes(projection='3d')
- z = np.linspace(0, 1, 100)
- x = z * np.sin(20 * z)
- y = z * np.cos(20 * z)
- #调用 ax.plot3D创建三维线图
- ax.scatter3D(x, y, z, 'gray')
- ax.set_title('3D line plot')
- plt.show()
该图原理跟先前的等高线图其实是一致的,只不过区别一个为2D一个为3D
- from mpl_toolkits import mplot3d
- import numpy as np
- import matplotlib.pyplot as plt
- def f(x,y):
- return np.sin(np.sqrt(x**2+y**2))
- x=np.linspace(-6,6,30)
- y=np.linspace(-6,6,30)
- X,Y=np.meshgrid(x,y)
- Z=f(X,Y)
- fig=plt.figure()
- ax=plt.axes(projection='3d')
- ax.contour3D(X, Y, Z, 50, cmap='binary')
- ax.set_xlabel('x')
- ax.set_ylabel('y')
- ax.set_zlabel('z')
- ax.set_title('3D contour')
- plt.show()
在3D绘图里,表面绘图还给了多种选项,有网格镂空,也有网格填充的
- from mpl_toolkits import mplot3d
- import numpy as np
- import matplotlib.pyplot as plt
- #要绘制函数图像
- def f(x, y):
- return np.sin(np.sqrt(x ** 2 + y ** 2))
- #准备x,y数据
- x = np.linspace(-6, 6, 30)
- y = np.linspace(-6, 6, 30)
- #生成x、y网格化数据
- X, Y = np.meshgrid(x, y)
- #准备z值
- Z = f(X, Y)
- #绘制图像
- fig = plt.figure()
- ax = plt.axes(projection='3d')
- #调用绘制线框图的函数plot_wireframe()
- ax.plot_wireframe(X, Y, Z, color='aqua')
- ax.set_title('wireframe')
- plt.show()
- from mpl_toolkits import mplot3d
- import numpy as np
- import matplotlib.pyplot as plt
- x=np.outer(np.linspace(-2,2,30),np.ones(30))
- y=x.copy().T
- z=np.cos(x**2+y**2)
- fig=plt.figure()
- ax=plt.axes(projection='3d')
- ax.plot_surface(x, y, z,cmap='viridis', edgecolor='none')
- ax.set_title('Surface plot')
- plt.show()
总结:matplotlib绘图库的功能是十分强大的,想要将其的所有功能做一一讲解是几乎不可能的一件事,如果有本文章未能提及的内容,请移步至Matplotlib的官网,里面有大量实例以及讲解。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。