2022年 11月 8日

python 绘图库Matplotlib总结

本节导图:https://www.processon.com/view/link/5fde0dbfe0b34d66b824203b

文章目录

    • 绘图库Matplotlib
    • 简单例子
    • 绘图对象的理解
    • 一些常用类型图的例子
    • 高级封装Seaborn

绘图库Matplotlib

  • matplotib是Python最著名的绘图库,它提供了一套可以与MATLAB媲美的绘图函数集,非常适合几行代码就可以快速绘图
  • matplottib内部使用面向对象实现,组成图标的各个元素都是对象。

面向对象接口使用起来比较复杂,matplotib提供了pyplot模块来实现快速绘图,它的API非常类似于MATLAB,它将复杂的对象关系隐藏起来,方便我们快速使用。

简单例子

import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif']=['SimHei']#显示中文字体标签
plt.rcParams['axes.unicode_minus']=False

x = np.linspace(0, 10, 1000)
y = np.sin(x)
z = np.cos(x**2)

plt.figure(figsize= (12, 4))#设置图像高宽比
plt.plot(x, y, label= "$sin(x)$",color = "red", linewidth= 2)#线属性
plt.plot(x, z, label = "$cos(x^2)$", color = "blue")

plt.xlabel("横轴")#图属性:横纵坐标,标题横纵坐标显示属性
plt.ylabel("纵轴")
plt.title("demo")
plt.ylim(-1.5, 1.5)#纵坐标范围
plt.xlim(0, 11)
plt.legend(loc ="upper right")

plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

image-20211119111802433

绘图对象的理解

matplotib内部全部使用面向对象实现,组成图标的各个元素都是对象。

虽然可以通过pyplot快速绘图,但是在编写大型应用程序时,通过面向对象的方式调用将更加有效;

另外,如果理解了matplotb内的对象含义及其关系,这将更有助于我们更好的用好pyplot。

类关系

  • 所有可渲染的对象都有一个基类,为Artist类,它是一个抽象类;
  • 可渲染对象包括两种类型:简单类型和容器类型;
  • 简单类型是标准的绘图组件,例如:Line2D,Rectangle、Text,Axes Image等;
  • 容器类型可以包含多个组牛,主要将这些组件组织起来,例如:Axis、Axes、Figure等;
  • 在matplotib中,整个图像为一个figure对象。在Figure对象中可以包含一个,或者多个Axes对象。每个Axes对象都是一个拥有自己坐标系统的绘图区域,并且包含多个Axis坐标轴。逻辑关系如下:

image-20211121195715315

Axes内部可以细分,下面是一个具体的直线图中,我们看到还有如下对象:

image-20211121195809151

Axis就是前一个图上的Axis;Title为标题,你可以为你的图起一个标题;Label为坐标轴标签;Tick为刻度线:Tick Label为刻度注释;中间是Line;

完整对象树参考下图:

image-20211121200855586

绘图流程

1.创建Fiqure对象;
2.为Fiqure对象创建一个或多个Axes对象;
3,调用Axes对象的方法,创建一些Axis ,Title ,Line2D等简单类型组件,并设置其相关属性;(无需自己去手动创建这些简单组件对象)
4,通过Figure对象展示图像;

import matplotlib.pyplot as plt 
import numpy as np
#准备数据
xs = np.arange(150)
ys = xs  ** 2
zs = np.cos(xs)


figure = plt.figure() #通过plt.figure(),生成rigure对象

#创建第一个axes(左上角)
axesl = figure.add_subplot(221) #调用figure.add subplot((),创建第一个axes对象;
                                    #声明2*2布局,选第1块
axesl.set_xlabel('x') #设置xaxis对象的 label 
axes1.set_ylabel('y') #设置yaxis对象的1abel 
axesl.set title('plot1') #设置axes对象的title 
axesl.plot(xs,ys) #通过plot方法,声明data,创建Line2D对象

#创建第二个axes(右下角)
axes2 = figure.add_subplot(224*沿用2*2布局,选第4块
axes2.set xlabel('x')
axes2.set ylabel('z')
axes2.set_title('plot2')
axes2.plot(xs,zs)
figure.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

image-20211121213457732

当你仅需要一张子图时,全部基于plt的方法调用,已经帮你隐藏了axes对象的创建;

类似上面一般流程的例子中,axes对象也在尝试帮我们隐藏axis ,label等对象的创建,简化我们的使用;

一些常用类型图的例子

散点图

import numpy as np 
import matplot1ib.pyplot as plt
# 定义50个点
N = 50
x = np.random.rand(N) #随机产生x坐标
y = np.random.rand(N) #随机产生y坐标
area = np.pi*(15*np.random.rand(N))**2 #随机产生面积
colors = np.random.rand(N) #随机产生顾色(matplotlib可以自动将0-1的浮点数转为颜色)
plt.scatter(x,y,a = area, colors,alpha = 0.5) #声明每个点的:xy坐标、面积、颜色,以及透明度为0.5
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

image-20211121215409370

条形图

import matplotlib.pyplot as plt
import numpy as np

xs = np.arange(0, 10)
ys = np.random.randint(100, 200, 10)

plt.bar(xs, ys) #绘制条形图
plt.xticks(xsm ['x_{}'.format(x+1) for x in xs]) #设置xtick
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

image-20211121223112706

饼图

import matplotlib.pyplot as plt
labels = ['apple', 'orange', 'pear', 'peach'] #四个label
sizes = [15, 20, 17, 35] #四个size
explode = [0, 0.1, 0, 0] #四个偏移量
fig1, ax1 = plt.subplots() #通过无参的subplots方法,同时获得figure对象和axes对象
ax1.pie(sizes, explode = explode ,labels = labels, autopct = '%1.1f%%',
		shadow = True, startangle = 90) #绘制饼图 autopct:自动根据数值进行百分比运算
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

image-20211121223524978

matplotib官方提供了一个gallery页面,展示了各种缩略图及对应代码,在画图前,可以快速浏览、从里面找到想要的图,然后点击进入代码界面,然后复制修改样例代码即可,非常方便。

高级封装Seaborn

基于Matplotib核心库进行了更高阶的API封装,可以让你轻松地画出更漂亮的统计图形。Seaborn的漂亮主要体现在配色更加舒服、图形元素的样式更加细腻。

我们可以通过使用seaborn,仅加入一行(不包括import),使上述的柱状图更好看:

如修改上面的条形统计图样例:

import matplotlib.pyplot as plt
import numpy as np
import seaborn as sbn
sbn.set(style = 'darkgrid', palette = 'deep') #设置style为暗色分块, 调色板(palette)为深暗色

xs = np.arange(0, 10)
ys = np.random.randint(100, 200, 10)

plt.bar(xs, ys) #绘制条形图
plt.xticks(xsm ['x_{}'.format(x+1) for x in xs]) #设置xtick
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

image-20211122134452813

seaborn主要提供了好看的统计图接口,它的接口十分清晰,主要的四种统计接口,

1,可视化统计关系:使用散点图、直线图,对数据进行关联性分析;
2,可视化数据分布:使用直方图、累积分布图、核密度图、多变量分布图,来展示数据分布;
3,用分类数据绘图:使用分类散点图、分类分布图、分类估计图,来展示离散的类别数据;
4,可视化回归模型:在上述可视化的基础上,做一些简单的回归拟合;

更详细的参考下面链接:http://seaborn.pydata.org/tutorial.html