当前位置:   article > 正文

Matplotlib赋予Python数据一双眼_import numpy as np import matplotlib.pyplot as plt

import numpy as np import matplotlib.pyplot as plt

目录

一、简介

二、基本绘图

1、绘图

2、保存图片

3、更改颜色

4、更改线条样式

5、柱状图

 6、标题

7、饼状图

 8、散点图

 9、箱线图

10、小提琴图

 三、高级的图

1、等高线到热图

 2、线段上下填充

 四、面对对象方式绘图

1、画中画

 2、多图并行

3、不同大小

五、3D绘图

1、3D散点

2、3D表面图


一、简介

        如Matplotlib名字一般,Matplotlib是模仿MATLAB中plot绘图函数的一个library(库),它拥有MATLAB绘图的基本所有功能,同时还拥有许多自己特有DIY操作。

        Matplotlib是建立在NumPy数组上的多平台数据可视化的库,期初是为了更好的与SciPy堆栈一起工作使用。

        目前基于Matplotlib构建的新包也是层出不穷,例如Seaborn,ggplot,Altair,甚至是Pandas本身也可以作为Matplotlib的包装器,但是即使是使用这些包装器,对Matplotlib的学习也是很有必要的。

        本文章主要通过实例的展示,对Matplotlib的功能做一个入门的介绍。

二、基本绘图

1、绘图

既然是绘图工具包,那么首要的功能就是绘图了,我们直接进入主图,通过上面的介绍我们已经知道了,Matplotlib是模仿MATLAB的包,如果对MATLAB熟悉的小伙伴就会知道,plot的用法。正如MATLAB中的plot一样,Matplotlib也可以这样直接绘图。

  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. x=np.linspace(0,10,100)
  4. fig=plt.figure()#创建一张图片
  5. plt.plot(x,np.sin(x),'-')#使用实线绘出sin
  6. plt.plot(x,np.cos(x),'--')#使用虚线绘出cos

2、保存图片

  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. x=np.linspace(0,10,100)
  4. fig=plt.figure()#创建一张图片
  5. plt.plot(x,np.sin(x),'-')#使用实线绘出sin
  6. plt.plot(x,np.cos(x),'--')#使用虚线绘出cos
  7. fig.savefig('这是一张图片.jpg',dpi=300, bbox_inches = 'tight')#保存图片

 

这样就保存好一张图片了,同时我们可以通过设置dpi的大小来改变保存的清晰度,以及bbox_inches 来设置是否要保存图片的所有部分,包括不可见的部分。

3、更改颜色

如果你觉得颜色过于单调了,想要自己选择颜色,那么可以使用color这个这个属性

  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. x=np.linspace(0,10,100)
  4. colors=['blue',#名称
  5. 'r',#简称
  6. '0.75',#灰度值[0-1]
  7. '#FFDD44',#十六进制
  8. (1.0,0.2,0.6),#RGB[0-1]
  9. 'chartreuse']#颜色全称
  10. for i ,c in enumerate(colors):
  11. plt.plot(x,np.sin(x-i),color=c)

 

 

 

4、更改线条样式

如果觉得线条样式太过单一,你可以使用单引号加点和线段的组合表示线条类型

  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. x=np.linspace(0,10,100)
  4. codes=['-g','--c','-.k',':r']
  5. for i,code in enumerate(codes):
  6. plt.plot(x,x+i,code)

 

 也可以新增线段的标记点

  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. x=np.linspace(0,10,100)
  4. fig=plt.figure()#创建一张图片
  5. plt.plot(x,np.sin(x),'o-')#使用实线绘出sin
  6. plt.plot(x,np.cos(x),'ys-')#使用虚线绘出cos

 

类型标记符颜色
-实线o空心圆r红色
--双划线*星号g绿色
:虚线+加号b蓝色
:.点划线ys菱形m洋红色
-.下划线加点x交叉符c青绿色
-..下划线加两点^上三角y黄色
<左三角w黑色
>右三角k白色
v下三角
s正方形

5、柱状图

除了线性图,还可以画柱状图

  1. x=np.linspace(0,10,10)
  2. y=x
  3. plt.bar(x,y)

单组不够可以画成多组的

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. data=abs(np.random.randn(3,4))
  4. x=np.arange(4)
  5. fig=plt.figure()
  6. plt.bar(x + 0.00, data[0], color = 'b', width = 0.25)
  7. plt.bar(x + 0.25, data[1], color = 'g', width = 0.25)
  8. plt.bar(x + 0.50, data[2], color = 'r', width = 0.25)

 

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. a=np.array([25,21,23,33,15])
  4. b=np.array([56,23,34,23,11])
  5. c=np.array([34,89,45,54,12])
  6. #绘制堆叠图,主要使用bottom,可以设置柱状图底部的起始位置
  7. plt.bar(ind, a, width=0.5, color='skyblue',bottom=b+c)
  8. plt.bar(ind, b, width=0.5, color='lightblue',bottom=c)
  9. plt.bar(ind, c, width=0.5, color='teal')

 6、标题

现在图也画出来了,是不是觉得缺少点什么,一张标题应该要有它自己的标题跟注解的。那我们将原本的代码稍作修改

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. x_ticks=['AA','BB','CC','DD','EE']
  4. a=np.array([25,21,23,33,15])
  5. b=np.array([56,23,34,23,11])
  6. c=np.array([34,89,45,54,12])
  7. xspeace=[x for x,a in enumerate(x_ticks)]
  8. #绘制堆叠图,主要使用bottom,可以设置柱状图底部的起始位置
  9. plt.bar(xspeace, a, width=0.5,label='a', color='skyblue',bottom=b+c)
  10. plt.bar(xspeace, b, width=0.5,label='b', color='lightblue',bottom=c)
  11. plt.bar(xspeace, c, width=0.5,label='c', color='teal')
  12. #设置注解
  13. plt.xticks(xspeace, x_ticks) #x轴横坐标
  14. plt.ylabel("y lable") #y轴标签
  15. plt.xlabel("x lable") #x轴标签
  16. plt.legend(loc="upper right") #标签放置位置
  17. plt.title("Title")#图片标题

7、饼状图

  1. from matplotlib import pyplot as plt
  2. import numpy as np
  3. fig=plt.figure()
  4. Height = ['160', '165', '170', '175', '180']
  5. Count = [16,17,17,17,18]
  6. #绘制饼状图
  7. plt.pie(Count, labels = Height,autopct='%1.2f%%',
  8. colors=['skyblue','lightblue','teal','azure','cyan'])

 8、散点图

使用scatter函数进行绘图,与线的marker一样,散点图也有许多的marker

  1. from matplotlib import pyplot as plt
  2. import numpy as np
  3. rng=np.random.RandomState(seed=0)
  4. for marker in ['o','.',',','x','+','v','^','<','>','s','p','d']:
  5. plt.scatter(rng.rand(5),rng.rand(5),marker=marker)

设置可以通过s属性,alpha属性,调整标记的大小和透明度 

  1. from matplotlib import pyplot as plt
  2. import numpy as np
  3. rng=np.random.RandomState(seed=0)
  4. for marker in ['o','.',',','x','+','v','^','<','>','s','p','d']:
  5. plt.scatter(rng.rand(5),rng.rand(5),s=np.random.randint(500),alpha=np.random.random(),
  6. marker=marker)

 9、箱线图

使用boxplot画箱线图,其中,object为箱子数据

  1. from matplotlib import pyplot as plt
  2. np.random.seed(10)
  3. object1 = np.random.normal(100, 10, 200)
  4. object2 = np.random.normal(90, 20, 200)
  5. object3 = np.random.normal(80, 30, 200)
  6. object4 = np.random.normal(70, 40, 200)
  7. object5 = np.random.normal(60, 50, 200)
  8. DataList=[object1,object2,object3,object4,object5]
  9. fig = plt.figure()
  10. plt.boxplot(DataList)

10、小提琴图

 将boxplot改为violinplot则可以画出小提琴图

  1. from matplotlib import pyplot as plt
  2. np.random.seed(10)
  3. object1 = np.random.normal(100, 10, 200)
  4. object2 = np.random.normal(90, 20, 200)
  5. object3 = np.random.normal(80, 30, 200)
  6. object4 = np.random.normal(70, 40, 200)
  7. object5 = np.random.normal(60, 50, 200)
  8. DataList=[object1,object2,object3,object4,object5]
  9. fig = plt.figure()
  10. plt.violinplot(DataList)

 三、高级的图

1、等高线到热图

有些时候,我们还会遇到需要画等高线的情况

Matplotlib也帮我们预想到了

与Matlab一样,我们可以使用meshgrid与contour结合使用,来绘制等高线图

  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. plt.style.use('seaborn-white')#设置绘画风格
  4. #创建等高线的函数,不需要深度了解
  5. def f(x,y):
  6. return np.sin(x)**10+np.cos(10+y*x)+np.cos(x)
  7. x=np.linspace(0,5,50)
  8. y=np.linspace(0,5,40)
  9. X,Y=np.meshgrid(x,y)#获取网格坐标
  10. Z=f(X,Y)
  11. plt.contour(X,Y,Z,colors='k')

这边的网格坐标指的是,将X当作坐标系里的x,Y当作坐标系中的y做成的网格点的x,y坐标

 可以增加等级跟规格,使其数字可以与颜色对应

  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. plt.style.use('seaborn-white')#设置绘画风格
  4. #创建等高线的函数,不需要深度了解
  5. def f(x,y):
  6. return np.sin(x)**10+np.cos(10+y*x)+np.cos(x)
  7. x=np.linspace(0,5,50)
  8. y=np.linspace(0,5,40)
  9. X,Y=np.meshgrid(x,y)#获取网格坐标
  10. Z=f(X,Y)
  11. plt.contour(X,Y,Z,levels=20,cmap='RdGy')

使用contourf与colorbar,你就可以得到一个妥妥的热图了

  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. plt.style.use('seaborn-white')#设置绘画风格
  4. #创建等高线的函数,不需要深度了解
  5. def f(x,y):
  6. return np.sin(x)**10+np.cos(10+y*x)+np.cos(x)
  7. x=np.linspace(0,5,50)
  8. y=np.linspace(0,5,40)
  9. X,Y=np.meshgrid(x,y)#获取网格坐标
  10. Z=f(X,Y)
  11. plt.contourf(Z,levels=20,cmap='RdGy')
  12. plt.colorbar()

 

 2、线段上下填充

该图可以描述整体的变化趋势,也可以表示单一时刻的波动情况,这边的yfit即为上下限,yfit-dyfit为下限,yfit+dyfit为上限。注意:dyfit的shape需要与yfit的shape大小一致

  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. xfit=np.linspace(0,10,100)
  4. yfit=np.cos(xfit)
  5. plt.plot(xfit,yfit,'-',color='gray')
  6. dyfit=np.random.random(100)
  7. plt.fill_between(xfit,yfit-dyfit,yfit+dyfit,color='gray',alpha=0.2)

 四、面对对象方式绘图

我们先前所讲的绘图方式都是模仿MATLAB的绘图方式,使用plot直接进行绘图。但实际上,matplotlib有为我们提供另一种绘图方式,是绘图可以更加的灵活和丰富。

如果之前是将整个图片当成一个画板的画,这种形式则更想figure是一面墙,而我们可以在墙上的一个区域挂上一幅画进行绘制。

废话不多说,我们直接进入实例。

  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. x = np.arange(0, np.math.pi*2, 0.05)
  4. y = np.sin(x)
  5. #接下来我们不直接画图,我们创建一个plt的subplots对象,里面包含一张6*6大小的图片
  6. #且该图片充满整个plt的控件。既1行1列个图片,背景颜色设置为白色,清晰度为300
  7. fig,axs=plt.subplots(1,1,figsize=(5,5),facecolor='white',dpi=300)
  8. axs.plot(x,y)
  9. #同样的,我们可以设置它的标题,横轴、纵轴的标题
  10. axs.set_xlabel('angle')
  11. axs.set_ylabel('sine')
  12. axs.set_title("sine wave",fontdict = {'fontsize' : 20,'fontstyle' : 'oblique',
  13. 'color':'red','fontfamily': 'fantasy'},loc='left')

1、画中画

通过这种形式的编写,我们可以形成画中画的效果

  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. import math
  4. x = np.arange(0, math.pi*2, 0.05)
  5. fig=plt.figure()
  6. axes1=fig.add_axes([0.1,0.1,0.8,0.8])
  7. axes2 = fig.add_axes([0.55, 0.55, 0.3, 0.3]) # inset axes
  8. y=np.sin(x)
  9. axes1.plot(x,y)
  10. axes2.plot(x,np.cos(x),'--r')
  11. axes1.set_title('sine')
  12. axes2.set_title("cosine")
  13. axes1.set_xlabel("Angle",loc='left')
  14. plt.show()

 

 2、多图并行

可以形成多画并行的效果

  1. import matplotlib.pyplot as plt
  2. #该图中有两行两列图片,所以使用的为2,2
  3. fig,a = plt.subplots(2,2,figsize=(5,5),facecolor='white',dpi=300)
  4. import numpy as np
  5. x = np.arange(1,5)
  6. #绘制平方函数
  7. a[0][0].plot(x,x*x)
  8. a[0][0].set_title('square')
  9. #绘制平方根图像
  10. a[0][1].plot(x,np.sqrt(x))
  11. a[0][1].set_title('square root')
  12. #绘制指数函数
  13. a[1][0].plot(x,np.exp(x))
  14. a[1][0].set_title('exp')
  15. #绘制对数函数
  16. a[1][1].plot(x,np.log10(x))
  17. a[1][1].set_title('log')
  18. plt.show()

3、不同大小

还可以通过subplot2grid来分配各个图的大小

  1. import matplotlib.pyplot as plt
  2. a1=plt.subplot2grid((3,3),(0,0),colspan=2)
  3. a2 = plt.subplot2grid((3,3),(0,2), rowspan = 3)
  4. a3 = plt.subplot2grid((3,3),(1,0),rowspan = 2, colspan = 2)
  5. import numpy as np
  6. x = np.arange(1,10)
  7. a2.plot(x, x*x)
  8. a2.set_title('square')
  9. a1.plot(x, np.exp(x))
  10. a1.set_title('exp')
  11. a3.plot(x, np.log(x))
  12. a3.set_title('log')
  13. plt.tight_layout()
  14. plt.show()

 这边仅仅举例一个线性图的例子,之前所诉的绘图也均可使用该方式绘图,函数会有些许不同,不再做举例。

五、3D绘图

引入面对对象的方式,主要是这可以让我们在3D绘图中显得更加的得心应手。

1、3D散点

  1. from mpl_toolkits import mplot3d
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4. fig = plt.figure()
  5. ax = plt.axes(projection='3d')

通过projection属性的更改,就可以发现,画布有之前的2D变成了3D

 转至3D界面后,就可以使用scatter3D函数绘制3D散点图了

  1. from mpl_toolkits import mplot3d
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4. fig=plt.figure()
  5. ax=plt.axes(projection='3d')
  6. z = np.linspace(0, 1, 100)
  7. x = z * np.sin(20 * z)
  8. y = z * np.cos(20 * z)
  9. #调用 ax.plot3D创建三维线图
  10. ax.scatter3D(x, y, z, 'gray')
  11. ax.set_title('3D line plot')
  12. plt.show()

2、3D表面图

该图原理跟先前的等高线图其实是一致的,只不过区别一个为2D一个为3D

  1. from mpl_toolkits import mplot3d
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4. def f(x,y):
  5. return np.sin(np.sqrt(x**2+y**2))
  6. x=np.linspace(-6,6,30)
  7. y=np.linspace(-6,6,30)
  8. X,Y=np.meshgrid(x,y)
  9. Z=f(X,Y)
  10. fig=plt.figure()
  11. ax=plt.axes(projection='3d')
  12. ax.contour3D(X, Y, Z, 50, cmap='binary')
  13. ax.set_xlabel('x')
  14. ax.set_ylabel('y')
  15. ax.set_zlabel('z')
  16. ax.set_title('3D contour')
  17. plt.show()

 

在3D绘图里,表面绘图还给了多种选项,有网格镂空,也有网格填充的 

  1. from mpl_toolkits import mplot3d
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4. #要绘制函数图像
  5. def f(x, y):
  6. return np.sin(np.sqrt(x ** 2 + y ** 2))
  7. #准备x,y数据
  8. x = np.linspace(-6, 6, 30)
  9. y = np.linspace(-6, 6, 30)
  10. #生成x、y网格化数据
  11. X, Y = np.meshgrid(x, y)
  12. #准备z值
  13. Z = f(X, Y)
  14. #绘制图像
  15. fig = plt.figure()
  16. ax = plt.axes(projection='3d')
  17. #调用绘制线框图的函数plot_wireframe()
  18. ax.plot_wireframe(X, Y, Z, color='aqua')
  19. ax.set_title('wireframe')
  20. plt.show()

  1. from mpl_toolkits import mplot3d
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4. x=np.outer(np.linspace(-2,2,30),np.ones(30))
  5. y=x.copy().T
  6. z=np.cos(x**2+y**2)
  7. fig=plt.figure()
  8. ax=plt.axes(projection='3d')
  9. ax.plot_surface(x, y, z,cmap='viridis', edgecolor='none')
  10. ax.set_title('Surface plot')
  11. plt.show()

 

 总结:matplotlib绘图库的功能是十分强大的,想要将其的所有功能做一一讲解是几乎不可能的一件事,如果有本文章未能提及的内容,请移步至Matplotlib的官网,里面有大量实例以及讲解。

矩阵文档 — Matplotlib 3.5.3 文档

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/166981
推荐阅读
相关标签
  

闽ICP备14008679号