Python - 数据分析三剑客之Matplotlib
Matplotlib 是 Python 最著名的 2D 绘图库,它提供了一个交互式环境,可以生成各种静态、动态和交互式的图表。
一、Matplotlib 简介
1、主要特点
-
跨平台:支持 Windows、Linux 和 Mac OS X
-
多输出格式:支持 PNG、PDF、SVG 等多种格式
-
高度可定制:几乎可以控制图形的每个元素
-
多种图形类型:线图、柱状图、散点图、等高线图等
-
与 NumPy 无缝集成:完美支持 NumPy 数组
2、主要组件
pyplot
:提供类似 MATLAB 的绘图接口
pylab
:将 pyplot 与 numpy 合并到一个命名空间(不推荐使用)
Figure
:顶级容器,包含所有图表元素
Axes
:实际的绘图区域,包含坐标轴、标签等
官方案例库
https://matplotlib.org/stable/gallery/index.htmlhttps://matplotlib.org/stable/gallery/index.html
二、Matplotlib基本使用方法
(一)安装
1、安装 Matplotlib
pip install matplotlib
2、Matplotlib图像主要组成部分
Matplotlib图像的主要组成部分包括:
画布(figure):画布是所有绘制元素的顶级容器,可将其视为一张白纸,供我们后期创作;
轴域(axes):轴域是图中绘制数据的矩形区域,每个画布可以包含一个或多个轴,轴提供坐标系;
标题(title):标题是一个文本元素,通常用于提供所绘图像的信息;
轴标签(x label,y label):标签是为 x 轴和 y 轴提供描述的文本元素,用于提供单位或其他相关信息;
图例(legend):图例用于指示图中不同元素的含义;
网格线(grid):网格线用于帮助读者对齐刻度线,从而更准确地读取数据点的位置和值。
3、创建空白画布
在使用Matplotlib绘制图形时,其中有两个最为常用的场景。一个是画点,一个是画线。pyplot基本方法的使用如下表:
plt.figure(num=None,figsize=None,dpi=None,facecolor=None,edgecolor=None,frameon=True)
num:画布编号,默认值为1;
figsize:指定画布宽高,默认为(6.4,4.8);
dpi:图像分辨率,单位为pixel/inch,默认值为80;
facecolor:背景颜色,默认值为白色;
edgecolor:边框颜色;
frameon:是否显示边框,默认显示。
import numpy as np
from matplotlib import pyplot as plt
fig=plt.figure(figsize=(8,6),dpi=100,facecolor='c') # 创建一个尺寸为(8,6),分辨率为100dpi,背景色为青色的画布
plt.show()
4、基本绘图
import matplotlib.pyplot as plt
import numpy as np# 创建数据
x = np.linspace(0, 10, 100)
y = np.sin(x)# 创建图形
plt.figure(figsize=(8, 4)) # 设置图形大小# 绘制曲线
plt.plot(x, y, label='sin(x)', color='blue', linewidth=2)# 添加标题和标签
plt.title('Sine Wave')
plt.xlabel('x axis')
plt.ylabel('y axis')# 添加图例
plt.legend()# 显示网格
plt.grid(True)# 显示图形
plt.show()
(二)常用图表类型
1、折线图
折线图 :以折线的上升或下降来表示统计数量的增减变化的统计图
特点:能够显示数据的变化趋势,反映事物的变化情况。 ( 变化 )
api: plt.plot(x, y)
plt.plot(x, y1, label='Line 1')
plt.plot(x, y2, label='Line 2')
plt.plot(x,y,*args)
主要设置参数有:color(c,颜色)、linestyle(ls,线型)、marker(点标记)、linewidth(lw,线宽),markersize(标记大小)、markerfacecolor(mfc,标记填充色),label(标签,与图例配合使用)、alpha(透明度,取值为0-1,0为完全透明,1为完全不透明)等。
其中主要颜色有:
r(red) | 红色 |
b(blue) | 蓝色 |
g(green) | 绿色 |
y(yellow) | 黄色 |
k(black) | 黑色 |
w(white) | 白色 |
c(cyan) | 青色 |
m(magenta) | 洋红色 |
此外,还支持十六进制的RGB色号,如:
主要线型有:
- | solid |
-- | dashed |
-. | dashdot |
: | dotted |
主要点标记有:
marker | description | marker | description |
"." | point | "," | pixel |
"o" | circle | "v" | triangle_down |
"^" | triangle_up | "<" | triangle_left |
">" | triangle_right | "1" | tri_down |
"2" | tri_up | "3" | tri_left |
"4" | tri_right | "8" | octagon |
"s" | square | "p" | pentagon |
"P" | plus (filled) | "*" | star |
"h" | hexagon1 | "H" | hexagon2 |
"+" | plus | "x" | x |
"X" | x (filled) | "D" | diamond |
"d" | thin_diamond | "|" | vline |
"_" | hline |
其样式如下:
2、散点图
散点图: 用两组数据构成多个坐标点,考察坐标点的分布 , 判断两变量之间是否存在某种关联或总结坐标
点的分布模式。
特点:判断变量之间是否存在数量关联趋势 , 展示离群点 ( 分布规律 )
api: plt.scatter(x, y)
x = [1, 2, 3, 4, 5]
y = [2, 3, 5, 7, 11]
plt.scatter(x, y, color='red') # 绘制红色散点图
plt.title("Simple Scatter Plot") # 设置图表标题
plt.xlabel("X-axis") # 设置X轴标签
plt.ylabel("Y-axis") # 设置Y轴标签
plt.show() # 显示图表
3、柱状图
柱状图: 排列在工作表的列或行中的数据可以绘制到柱状图中。
特点:绘制连离散的数据 , 能够一眼看出各个数据的大小 , 比较数据之间的差别。 ( 统计 / 对比 )
api: plt.bar(x, width, align='center', **kwargs)
Parameters:
x : 需要传递的数据
width : 柱状图的宽度
align : 每个柱状图的位置对齐方式
{'center', 'edge'}, optional, default: 'center'
**kwargs :
color: 选择柱状图的颜色
categories = ['A', 'B', 'C', 'D']
values = [3, 7, 5, 4]
plt.bar(categories, values, color='blue') # 绘制蓝色柱状图
plt.title("Simple Bar Chart") # 设置图表标题
plt.xlabel("Categories") # 设置X轴标签
plt.ylabel("Values") # 设置Y轴标签
plt.show() # 显示图表
4、饼图
饼图: 用于表示不同分类的占比情况,通过弧度大小来对比各种分类。
特点:分类数据的占比情况 ( 占比 )
api: plt.pie(x, labels=,autopct=,colors)
Parameters:
x: 数量,自动算百分比
labels: 每部分名称
autopct: 占比显示指定 %1.2f%%
colors: 每部分颜色
sizes = [25, 35, 25, 15]
labels = ['Category A', 'Category B', 'Category C', 'Category D']
plt.pie(sizes, labels=labels, autopct='%1.1f%%') # 绘制饼图,显示百分比
plt.title("Simple Pie Chart") # 设置图表标题
plt.show() # 显示图表
5、直方图
由一系列高度不等的纵向条纹或线段表示数据分布的情况。 一般用横轴表示数据范围,纵轴表示分布情况。
特点:绘制连续性的数据展示一组或者多组数据的分布状况 ( 统计 )
api: matplotlib.pyplot.hist(x, bins=None)
Parameters:
x : 需要传递的数据
bins : 组距
# 1. 生成数据
data = np.random.randn(500) # 生成500个服从标准正态分布的随机数
# 2. 创建画布
plt.figure(figsize=(10, 6))
# 3. 绘制直方图
plt.hist(data, bins=30, color='blue', alpha=0.7, rwidth=0.85)
# 4. 添加标题和标签
plt.title("Histogram of Normally Distributed Data")
plt.xlabel("Value")
plt.ylabel("Frequency")
# 5. 显示图像
plt.grid(True)
plt.show()
参数说明
bins=30:将数据分成 30 个等宽的区间,每个区间的宽度相同,统计每个区间内数据的频率。
color='blue':设置直方图条形为蓝色。
alpha=0.7:设置条形的透明度为 0.7,使得条形稍微透明。
rwidth=0.85:将条形的宽度设为区间宽度的 85%,留下 15% 的间隔,以便更清晰地分辨各个条形。
(三)高级功能
1、多子图
多子图可由以下两种方式绘制。
方式一:
fig=plt.figure(facecolor='lightblue')x1=np.linspace(0,2*np.pi,200)
y1=np.sin(x1)
plt.subplot(2,2,1) # 一共2×2个子图,此为第一个
plt.plot(x1,y1,linestyle='-',color='b',label='y=sin(x)')
plt.title('y=sin(x)')
plt.xlabel('x',loc='right')
plt.ylabel('y',loc='top')
plt.grid(alpha=0.8)
x_ticks=np.linspace(0,2*np.pi,5)
x_labels=['0','π/2','π','3π/2','2π']
plt.xticks(x_ticks,x_labels)
plt.yticks(np.linspace(-1,1,5))x2=np.linspace(0,2*np.pi,200)
y2=np.cos(x2)
plt.subplot(2,2,2) # 一共2×2个子图,此为第二个
plt.plot(x2,y2,linestyle='--',color='g',label='y=cos(x)')
plt.title('y=cos(x)')
plt.xlabel('x',loc='right')
plt.ylabel('y',loc='top')
plt.grid(axis='y',alpha=0.5)
plt.xticks(x_ticks,x_labels)
plt.yticks(np.linspace(-1,1,5))x3=np.linspace(0,10,200)
y3=np.exp(x3)
plt.subplot(2,2,3) # 一共2×2个子图,此为第三个
plt.plot(x3,y3,linestyle='-.',color='orange',alpha=0.7,label='y=e^x')
plt.title('y=e^x')
plt.xlabel('x',loc='right')
plt.ylabel('y',loc='top')x4=np.linspace(0.01,10,200)
y4=np.log10(x4)
plt.subplot(2,2,4) # 一共2×2个子图,此为第四个
plt.plot(x4,y4,linestyle=':',color='r',alpha=0.6,label='y=lg(x)')
plt.title('y=lg(x)')
plt.xlabel('x',loc='right')
plt.ylabel('y',loc='top')plt.tight_layout() # 自动调整布局(紧凑布局)
plt.show()
方式二:
fig,ax=plt.subplots(2,2) # 这种创建方式会返回fig、ax两个对象,其中ax是一个轴域列表,形状与子图的形状一致
ax1,ax2,ax3,ax4=ax.flatten() # 可以将列表展平后逐个取出x1=np.linspace(0,2*np.pi,200)
y1=np.sin(x1)
ax1.plot(x1,y1,label='y=sin(x)')
ax1.set_title('y=sin(x)')x2=np.linspace(0,2*np.pi,200)
y2=np.cos(x2)
ax2.plot(x2,y2,label='y=cos(x)')
ax2.set_title('y=cos(x)')x3=np.linspace(0,10,200)
y3=np.exp(x3)
ax3.plot(x3,y3,label='y=e^x')
ax3.set_title('y=e^x')x4=np.linspace(-5,5,200)
y4=np.power(x4,2)
ax4.plot(x4,y4,label='y=x^2')
ax4.set_title('y=x^2')plt.tight_layout()
plt.show()
2、3D 绘图
matplotlib支持绘制三维线框图, 三维曲面图, 三维散点图. 需要使用axes3d提供3d坐标系
import numpy as np
import matplotlib.pyplot as pltfig = plt.figure()
ax3d = fig.add_subplot(121, projection='3d')# filled为bool类型数组,在True的元素下标位置绘制体元素
i, j, k = np.indices((3, 3, 3))
filled = (i == j) & (j == k) # 3行3列3层,对角线为True
c = plt.get_cmap('RdBu')(np.linspace(0, 1, 27)).reshape(3, 3, 3, 4)# ax3d.voxels(filled) #filled为True的位置绘制六面体
ax3d.voxels(filled, facecolors=c) # filled为True的位置绘制六面体,并设置颜色#
ax3d = fig.add_subplot(122, projection='3d')
# x,y,z=np.indices((3,4,5))
# ax3d.voxels(x,y,z,filled)plt.show()
3、自定义样式
plt.style.use('ggplot') # 使用ggplot风格
# 其他可用风格:'seaborn', 'fivethirtyeight'等
(四)保存图形
plt.savefig('figure.png', dpi=300, bbox_inches='tight')
Matplotlib 功能强大且灵活,几乎可以创建任何类型的可视化图表。对于更高级的数据可视化,可以结合使用 Pandas 和 Seaborn 库。
参考文章
【Matplotlib基本使用】-CSDN博客
Python:Matplotlib详细使用_matplotlib在python中的用法-CSDN博客