Matplotlib赋予Python数据一双眼

目录

一、简介

二、基本绘图

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也可以这样直接绘图。

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

2、保存图片

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 来设置是否要保存图片的所有部分,包括不可见的部分。

3、更改颜色

如果你觉得颜色过于单调了,想要自己选择颜色,那么可以使用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)

 

 

 

4、更改线条样式

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

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正方形

5、柱状图

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

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') 

 6、标题

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

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")#图片标题

7、饼状图

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'])

 8、散点图

使用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)

 9、箱线图

使用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)

10、小提琴图

 将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)

 三、高级的图

1、等高线到热图

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

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

 

 2、线段上下填充

该图可以描述整体的变化趋势,也可以表示单一时刻的波动情况,这边的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')

1、画中画

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

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

 

 2、多图并行

可以形成多画并行的效果

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

3、不同大小

还可以通过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绘图

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

1、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()

2、3D表面图

该图原理跟先前的等高线图其实是一致的,只不过区别一个为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的官网,里面有大量实例以及讲解。

矩阵文档 — Matplotlib 3.5.3 文档

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值