「Matplotlib 入门指南」 Python 数据可视化分析【数据分析全栈攻略:爬虫+处理+可视化+报告】
- 第 107 篇 -
Date: 2025 - 06 - 15
Author: 郑龙浩(仟墨)
Matplotlib – 数据可视化分析
文章目录
- Matplotlib – 数据可视化分析
- 一 Matplotlib 基础
- 1 介绍
- 2 matplotlib的安装
- 3 matplotlib 的 pyplot 引用
- 4 打印可视化图形
- 二 `plt.plot()` --> 绘制图像:折线图
- 1 绘制线条
- 1.1 绘制 x 和 y点
- 1.2 两个点绘制 --> 1条直线
- 绘制两条线
- 1.3 只绘制两个点 --> 无线条
- 1.4 多个点绘制 --> 折线
- 1.5 自动匹配x轴的点
- 2 点标记(marker)
- 3 线型(linestyle)
- 4 颜色(`'color'/'c'、'markeredgecolor'/'mec'、'markerfacecolor'/'mfc'`)
- 4.1 **基本颜色**
- 4.2 优先级 和 区别
- 4.3 填充线条颜色
- 4.4 标记内部颜色、标记边框颜色
- 5 标记大小(Markersize)
- 6 线宽/线粗(Linewidth)
- 7 不透明度(Alpha)
- 7.1 `alpha`参数
- 7.2 单独控制标记透明与线条透明
- 8 标签
- 8.1 如果无法显示中文
- 8.2 标签的作用
- 8.3 绘图标题、x轴标签、y轴标签
- 8.4 设置标题、标签的字体属性
- 8.4.1 直接传参
- 8.4.2 使用字典
- 8.5 设置标题位置
- 8.6 所有参数
- 9 网格
- 9.1 添加网格
- 9.3 设置网格属性
- 三 `plt.subplot()` --> 创建多个子图
- 1 介绍
- 2 函数语法 + 使用方法
- 3 实操
- 四 `plt.scatter()` --> 绘制散点图
- 1 函数语法
- 2 创建散点图
- 3 点标记、点大小、透明度
- 4 设置点的颜色(新知识:颜色映射)
- 4.1 默认颜色 --> 当不指定时,默认颜色
- **手动指定颜色:**
- 4.2 颜色名称/缩写
- 4.3 十六进制颜色码
- 4.4 RGB/RGBA元组
- 4.5 灰度值
- 4.6 颜色映射(数值 --> 颜色)
- 4.6.1 基础用法
- 4.6.2 控制数值范围
- 4.6.3常用色表
- 4.6.4 自动归一化机制
- 4.7 为每个点单独指定颜色
- 5 示例
- 五 `plt.bar() / plt.barh()` --> 绘制柱状图
- 1 函数语法
- 1.1 `plt.bar()`
- 1.2 `plt.barh()`
- 1.3 区别
- 2 设置颜色
- 2.1 基础颜色
- 2.2 颜色映射(数值→颜色)
- 3 堆叠柱状图
- 4 分组柱状图
- 5 分组 + 颜色映射 示例
- 六 `plt.hist` --> 绘制直方图
- 1 函数语法
- 2 代码示例
- 七 `plt.pie` --> 绘制饼图
- 1 函数语法
- 2 参数说明
- 3 代码示例
- 3.1 基础创建
- 2. **突出显示B+阴影**
- 3. **环形饼图(甜甜圈图)**
一 Matplotlib 基础
1 介绍
Matplotlib是Python最常用的绘图库,用于创建静态、交互式和动态可视化
2 matplotlib的安装
-
在终端输入
pip install matplotlib
安装库 -
如果出现
Successfully installed contourpy-1.3.2......
之类的字样表示安装成功如果出现
Requirement already satisfied
之类的字样则表示已经安装过了
3 matplotlib 的 pyplot 引用
大部分使用的程序都是
pyplot
子模块下的,所以通常直接引用pyplot
import matplotlib.pyplot as plt
4 打印可视化图形
打印图形的时候,用 print 函数是打印不出来的,必须使用plt.show
使用方法如下:
import matplotlib.pyplot as plt
plt.show()
二 plt.plot()
--> 绘制图像:折线图
1 绘制线条
1.1 绘制 x 和 y点
- 用于在图标中绘制点(标记)
- 默认情况下,
plot()
函数是点到点绘制一条线
参数1是一个包含x轴上的点的数组
参数2是一个包含y轴上的点的数组
1.2 两个点绘制 --> 1条直线
import matplotlib.pyplot as plt
import numpy as np
import pandas as pdxPoints = np.array([1,20]) # x 轴
yPoints = np.array([12,100]) # y 轴
plt.plot(xPoints, yPoints) # 根据xy轴得出一条直线
plt.show()
打印结构如下
绘制两条线
当然也可以绘制两条线,只使用一个plt.show()
打印,如下:
import matplotlib.pyplot as plt
import numpy as np
xPoints = np.array([1,20]) # x 轴
yPoints = np.array([12,100]) # y 轴
yPoints2 = np.array([50,100]) # y 轴
plt.plot(xPoints, yPoints) # 根据xy轴得出一条直线
plt.plot(xPoints, yPoints2) # 根据xy轴得出一条直线
plt.show()
打印结果如下
1.3 只绘制两个点 --> 无线条
只绘制起点和终点两个点
plt.plot(xPoints, yPoints2, 'o')
plt.show()
效果
1.4 多个点绘制 --> 折线
其中,两个人参数中的数组元素数量必须保持一致
如果第一个数组3个元素,第二个数组5个元素,不匹配的话会报错
xPoints = np.array([1, 5, 7, 50, 100]) # x 轴
yPoints = np.array([2, 4, 25, 6, 60]) # y 轴
plt.plot(xPoints, yPoints)
plt.show()
效果
1.5 自动匹配x轴的点
当然,第一个参数可以不写,只写第二个参数,如果这样的话,x轴的点就是自动生成的了 --> 默认 从0开始,步长为1
比如y轴有5个元素,x轴就是 0 1 2 3 4
plt.plot(yPoints)
plt.show()
效果如下
plot()
中常用的参数有:点标记(marker)、线型(linestyle)、线条颜色(color)、标记大小(markersize)、线宽(linewidth)
2 点标记(marker)
标记符号 | 描述 | 示例 |
---|---|---|
'.' | 小圆点 | marker='.' |
',' | 像素点(极小方块) | marker=',' |
'o' | 大圆点 | marker='o' |
'v' | 下三角形(▼) | marker='v' |
'^' | 上三角形(▲) | marker='^' |
'<' | 左三角形(◀) | marker='<' |
'>' | 右三角形(▶) | marker='>' |
'1' | 下箭头(三线版) | marker='1' |
'2' | 上箭头(三线版) | marker='2' |
'3' | 左箭头(三线版) | marker='3' |
'4' | 右箭头(三线版) | marker='4' |
's' | 正方形(■) | marker='s' |
'p' | 五边形(⬟) | marker='p' |
'*' | 星号(★) | marker='*' |
'h' | 六边形(垂直,⬢) | marker='h' |
'H' | 六边形(水平,⬣) | marker='H' |
'+' | 加号(+) | marker='+' |
'x' | 叉号(✖) | marker='x' |
'D' | 菱形(◆) | marker='D' |
'd' | 瘦菱形(❖) | marker='d' |
'|' | 垂直线(│) | marker='|' |
'_' | 水平线(─) | marker='_' |
'P' | 填充加号(🞣) | marker='P' |
'X' | 填充叉号(🞨) | marker='X' |
'$...$' | LaTeX 符号(如 '$\u2665$' 显示❤️) | marker='$\u2665$' |
查看所有标记
import matplotlib.pyplot as plt
# Matplotlib支持的所有标记
markers = ['.', ',', 'o', 'v', '^', '<', '>', '1', '2', '3', '4','s', 'p', '*', 'h', 'H', '+', 'x', 'D', 'd', '|', '_', 'P', 'X',0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
plt.figure(figsize=(10, 3))
for i, marker in enumerate(markers):plt.plot(i, 0, marker=marker, markersize=10, label=f"{marker}")
plt.show()
效果
3 线型(linestyle)
线型符号 | 描述 | 示例 |
---|---|---|
'-' | 实线(默认) | linestyle='-' |
'--' | 虚线 | linestyle='--' |
'-.' | 点划线 | linestyle='-.' |
':' | 点线 | linestyle=':' |
'None' | 无线(仅显示点) | linestyle='None' |
简写 --> 线型可以和颜色写到一起:
plt.plot(x, y, 'r--') # 红色虚线
plt.plot(x, y, 'g:') # 绿色点线
4 颜色('color'/'c'、'markeredgecolor'/'mec'、'markerfacecolor'/'mfc'
)
可以填充两个部分:①线条颜色 ②标记内部颜色 ③标记边框颜色
4.1 基本颜色
类型 | 参数名 | 作用对象 | 示例 |
---|---|---|---|
统一颜色 | color /c | 同时设置线条、标记内部和边框 | color='red' |
标记内部颜色 | markerfacecolor /mfc | 仅标记填充色 | markerfacecolor='#FF5733' |
标记边框颜色 | markeredgecolor /mec | 仅标记边框色 | markeredgecolor=(0,0.5,0) |
颜色符号 | 描述 | 示例 |
---|---|---|
'b' | 蓝色(blue) | color='b' |
'g' | 绿色(green) | color='g' |
'r' | 红色(red) | color='r' |
'c' | 青色(cyan) | color='c' |
'm' | 品红(magenta) | color='m' |
'y' | 黄色(yellow) | color='y' |
'k' | 黑色(black) | color='k' |
'w' | 白色(white) | color='w' |
其他颜色格式
当然不只是只有这几个颜色,也可以用如下方式去表示其他的颜色
格式 | 示例 |
---|---|
RGB 元组(0-1) | color=(0.2, 0.5, 0.8) |
十六进制颜色 | color='#FF5733' |
颜色名称(字符串) | color='orange' |
4.2 优先级 和 区别
属性 | 参数名(缩写) | 作用对象 | 默认 | 优先级 |
---|---|---|---|---|
线条颜色 | color ( c ) | 连接数据点的线 | 继承自全局样式或默认色 | 最低 |
标记内部颜色 | markerfacecolor (mfc ) | 数据点标记的填充色 | 默认与线条颜色相同 | 中等 |
标记边框颜色 | markeredgecolor (mec ) | 数据点标记的边框色 | 默认与线条颜色相同 | 最高 |
4.3 填充线条颜色
代码示例
# sin函数图像
x = np.linspace(0, 10, 20)
y = np.sin(x)
# xy轴,实线,大圆点
# plt.plot(x, y, color='b', linestyle='-', marker='o')
# 十六进制颜色
plt.plot(x, y, color='#FF5733') # 橙色# RGB元组
plt.plot(x+1, y+1, color=(0.2, 0.6, 0.8)) # 天蓝色# 颜色名称(全称/简称)
plt.plot(x+2, y+2, color='darkorange') # 深橙色
plt.plot(x+3, y+3, color='y') # 黄色
plt.show()
效果
4.4 标记内部颜色、标记边框颜色
如下所示,
- 如果不指定标记内部颜色、标记边框颜色,则全都默认为“线条颜色”
- 如果不指定标记内部颜色,则标记内部颜色默认为“线条颜色”
- 如果不指定标记边框颜色,则标记边框颜色默认为“线条颜色”
代码示例
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 20)
y = np.sin(x)
plt.plot(x+1, y+1, marker='o', color='r', linestyle='-')
plt.plot(x, y, marker='o', color='r', mfc='y') # color='r'--> 线条颜色红色, mec='y'--> 标记颜色"黄色“
plt.plot(x, y, marker='o', color='r', mfc='y', mec='black') # 新增边框颜色为“黑色”
plt.show()
效果
5 标记大小(Markersize)
参数 | 描述 | 示例 |
---|---|---|
markersize | 标记大小(默认 6) | markersize=10 |
示例代码
x = np.linspace(0, 10, 20)
y = np.sin(x)plt.plot(x, y, marker='d', color='b', markersize='10')
plt.show()
效果
6 线宽/线粗(Linewidth)
这里的线宽,指的就是线的粗度
参数 | 描述 | 示例 |
---|---|---|
linewidth | 线宽(默认 1.5) | linewidth=2 |
示例代码
plt.plot(x, y, marker='d', color='b', markersize='10', linewidth='0.1')
plt.plot(x+1, y+1, marker='d', color='b', markersize='10', linewidth='5')
plt.show()
效果
7 不透明度(Alpha)
7.1 alpha
参数
alpha
这个参数取值范围是 0(完全透明)到 1(完全不透明)
添加不透明度
import numpy as np
import matplotlib.pyplot as pltx = np.linspace(0, 10, 20)
y = np.sin(x)
plt.plot(x+2, y+2, marker='o', color='r', alpha=0.7) # 70% 不透明
plt.plot(x+1, y+1, marker='o', color='r', mfc='y', alpha=0.5) # 50% 不透明
plt.plot(x, y, marker='o', color='r', mfc='y', mec='black', alpha=0.3) # 30% 不透明plt.show()
7.2 单独控制标记透明与线条透明
- 仅标记透明:通过调整颜色RGBA值实现
plt.plot(x, y, marker='o', color='r', mfc=(1, 1, 0, 0.5)) # 黄色标记50%透明
- 仅线条透明:
plt.plot(x, y, marker='o', color=(1, 0, 0, 0.3), mfc='y') # 红色线条30%透明
代码
plt.plot(x, y, marker='o', color='r', mfc=(1, 1, 0, 0.5)) # 黄色标记50%透明
plt.plot(x+1, y+1, marker='o', color=(1, 0, 0, 0.3), mfc='y') # 红色线条30%透明
plt.show()
效果
8 标签
是用于说明图表坐标轴含义和图表主题的文本描述,使数据可视化更清晰易懂
8.1 如果无法显示中文
无法正常显示中文:
Matplotlib 最初是为科学计算设计的,早期主要面向英文用户,默认使用英文字体(如 DejaVu Sans)。这些字体不包含中文字符集,遇到中文时会自动回退到空白或方框(□)
标签中写中文的时候,可能无法正常显示,比如中文显示为方框(□)或乱码
想要解决的话,可以手动设置字体
plt.rcParams['font.sans-serif'] = ['SimHei'] # 默认字体--黑体
8.2 标签的作用
- x轴:表示什么数据(如时间、距离、类别)
- y轴:表示什么数据(如温度、销量、频率)
- 标题:图表的核心主题
8.3 绘图标题、x轴标签、y轴标签
可以为绘图设置标签,也可以给x和y轴设置标签
代码示例
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei'] # 默认字体--黑体
days = np.array(['2025.6.13', '6.14', '6.15', '6.16', '6.17', '6.18', '6.19']) # 日期
temperature1 = np.array([22, 22, 22, 22, 21, 23, 21]) # 温度数据 - 最低温
temperature2 = np.array([29, 31, 28, 29, 28, 36, 28]) # 温度数据 - 最高温
plt.plot(days, temperature1, color='b', marker='o', linestyle='--') # 最低温
plt.plot(days, temperature2, color='r', marker='o', linestyle='--') # 最高温plt.title('温度变化情况')
plt.ylabel('温度(℃)')
plt.xlabel('日期')
plt.show()
实现效果
8.4 设置标题、标签的字体属性
8.4.1 直接传参
实现代码
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei'] # 默认字体--黑体
days = np.array(['2025.6.13', '6.14', '6.15', '6.16', '6.17', '6.18', '6.19']) # 日期
temperature1 = np.array([22, 22, 22, 22, 21, 23, 21]) # 温度数据 - 最低温
temperature2 = np.array([29, 31, 28, 29, 28, 36, 28]) # 温度数据 - 最高温
plt.plot(days, temperature1, color='b', marker='o', linestyle='--') # 最低温
plt.plot(days, temperature2, color='r', marker='o', linestyle='--') # 最高温# 1. 设置标题属性
plt.title('温度变化情况', # 标签名fontfamily='SimHei', # 字体(Windows系统黑体)fontsize=16, # 字体大小 单位-->磅fontweight='bold', # 加粗 ('normal'/'bold')color='b', # 蓝色pad=20 # 标题与图的间距
)# 2. 设置Y轴标签属性
plt.ylabel('温度(℃)', # 标签名fontfamily='Microsoft YaHei', # 微软雅黑fontsize=15, # 字体大小fontstyle='italic', # 斜体color='r', # 红色labelpad=15, # 标签与坐标轴的间距rotation=45, # 标签旋转角度 (单位-->度)
)# 3. 设置X轴标签属性
plt.xlabel('日期',fontfamily='SimHei', # 黑体fontsize=15, # 字体大小rotation=-5, # 标签旋转角度 (单位-->度)color='g', # 绿色fontweight='bold', # 加粗labelpad=10 # 标签与坐标轴的间距
)plt.show()
实现效果
8.4.2 使用字典
当然也可以用字典,个人感觉这样写看起来比较整洁简单
实现代码
plt.rcParams['font.sans-serif'] = ['SimHei'] # 默认字体--黑体
days = np.array(['2025.6.13', '6.14', '6.15', '6.16', '6.17', '6.18', '6.19']) # 日期
temperature1 = np.array([22, 22, 22, 22, 21, 23, 21]) # 温度数据 - 最低温
temperature2 = np.array([29, 31, 28, 29, 28, 36, 28]) # 温度数据 - 最高温
plt.plot(days, temperature1, color='b', marker='o', linestyle='--') # 最低温
plt.plot(days, temperature2, color='r', marker='o', linestyle='--') # 最高温# 1. 标题属性字典(移除了pad)
title_font = {'fontfamily': 'SimHei','fontsize': 16,'fontweight': 'bold','color': 'b'
}# 2. Y轴标签属性字典
ylabel_font = {'fontfamily': 'Microsoft YaHei','fontsize': 15,'fontstyle': 'italic','color': 'r','rotation': 45
}# 3. X轴标签属性字典
xlabel_font = {'fontfamily': 'SimHei','fontsize': 15,'rotation': -5,'color': 'g','fontweight': 'bold'
}# 应用字典设置,pad作为单独参数
plt.title('温度变化情况', fontdict=title_font, pad=20)
plt.ylabel('温度(℃)', fontdict=ylabel_font, labelpad=15)
plt.xlabel('日期', fontdict=xlabel_font, labelpad=10)plt.show()
实现效果
8.5 设置标题位置
loc参数可以指定三种:legt/right/center
– 靠左,靠右,居中
(默认居中)
实现代码
plt.title('温度变化情况', loc='left') # legt/right/center
plt.ylabel('温度(℃)')
plt.xlabel('日期')plt.show()
实现效果
8.6 所有参数
参数名 | 可选值/类型 | 说明 | 适用函数 |
---|---|---|---|
fontfamily | 字符串或字体名 | 指定字体家族,如 'SimHei' , 'Arial' , 'serif' | 所有文本函数 |
fontsize | 数值或相对大小 | 字体大小(磅),如 12 ,或相对值 'xx-small' , 'x-large' | 所有文本函数 |
fontweight | 字符串或数值 | 字体粗细:'normal' , 'bold' , 'light' , 或数值 100-900 | 所有文本函数 |
fontstyle | 'normal' , 'italic' , 'oblique' | 字体样式(常规/斜体/倾斜) | 所有文本函数 |
color | 颜色字符串/RGB元组/十六进制 | 文本颜色,如 'red' , (0.1,0.2,0.3) , '#FF0000' | 所有文本函数 |
rotation | 数值(度)或字符串 | 文本旋转角度(如 45 ),或 'vertical' , 'horizontal' | xlabel() /ylabel() /text() |
labelpad | 数值 | 标签与坐标轴的间距(磅),仅适用于坐标轴标签 | xlabel() /ylabel() |
backgroundcolor | 颜色值 | 文本背景色 | 所有文本函数 |
alpha | 0-1之间的浮点数 | 文本透明度 | 所有文本函数 |
verticalalignment | 'top' , 'center' , 'bottom' , 'baseline' | 文本垂直对齐方式 | text() /标题类函数 |
horizontalalignment | 'left' , 'center' , 'right' | 文本水平对齐方式 | 所有文本函数 |
bbox | 字典 | 文本边框样式,如 {'boxstyle':'round', 'facecolor':'yellow'} | 所有文本函数 |
usetex | True /False | 是否使用LaTeX渲染(需系统安装LaTeX) | 所有文本函数 |
9 网格
9.1 添加网格
visible=True
可省略此参数
三种
① 全部
axis='both'
可以省略
import numpy as np
import matplotlib.pyplot as plt
y = np.array([1, 10])
plt.plot(y)
plt.grid(axis='both'o) # 显示全部
plt.show() # 全部显示
② 仅纵向
import numpy as np
import matplotlib.pyplot as plt
y = np.array([1, 10])
plt.plot(y)
plt.grid(axis = 'x') # 只显示纵向网格
plt.show() # 全部显示
③ 仅横向
import numpy as np
import matplotlib.pyplot as plt
y = np.array([1, 10])
plt.plot(y)
plt.grid(axis = 'y') # 只显示横向网格
plt.show() # 全部显示
9.3 设置网格属性
函数语法
plt.grid(visible=True, # 是否显示网格(True/False) --> 默认为 Truewhich='major', # 网格类型:'major'主网格,默认 / 'minor'次网格)/ 'both'axis='both', # 显示方向:'x'(仅x轴)/ 'y'(仅y轴)/ 'both'(默认,双轴)color='gray', # 网格线颜色linestyle=':', # 线型:'-'(实线),'--'(虚线),':'(点线),'-.'(点划线)linewidth=0.5, # 线宽(单位:磅)alpha=0.4 # 透明度(0.0透明 ~ 1.0不透明)
)
线型、颜色、线宽、透明度和前面那些函数的用法相同
plt.grid(visible=True, # 是否显示网格(True/False)which='major', # 网格类型:'major'(主网格)/ 'minor'(次网格)/ 'both'axis='both',color='b',linestyle='--',linewidth=1,alpha=0.7
)plt.show() # 全部显示
三 plt.subplot()
--> 创建多个子图
1 介绍
subplot()
是Matplotlib
库中用于在单个画布上创建和管理多个子图的核心函数。能够将多个图表以网格形式排列在一个图形窗口中,非常适合数据对比分析或多角度展示数据。
如果需要很多个线条在同一图中显示,有时会显得凌乱,所以可以创建多个图,进行整理和分析
2 函数语法 + 使用方法
说白了,三个参数意思就是: 总共有几行,几列,当前图的位置(横着数,数到头就换行)
plt.subplot(nrows, # 子图网格的行数ncols, # 子图网格的列数index # 当前子图的位置(从1开始编号)
)
- nrows:子图网格的行数
- ncols:子图网格的列数
- index:当前子图的位置(从1开始,按行优先编号)
还可以给子图加标题
也可以给总图加标题 – > 使用超级标题
plt.suptitle('超级标题')
3 实操
import numpy as np
import matplotlib.pyplot as plt# plt.grid() # 显示全部
# plt.grid(axis = 'x') # 只显示纵向网格# 第一个图
x = np.array([1, 5])
y = np.array([1, 10])
plt.title('总图', fontfamily='SimHei')
plt.subplot(2, 2, 1)
plt.plot(x, y)
plt.title('第1个图', fontfamily='SimHei')
# 第二个图
x2 = np.array([1, 5])
y2 = np.array([1, -10])
plt.subplot(2, 2, 2)
plt.plot(x2, y2)
plt.title('第2个图', fontfamily='SimHei')# 第三个图
x3 = np.array([1, 2, 3, 4]) # 修改为有序x值
y3 = np.array([2, 4, 6, 8])
plt.subplot(2, 2, 3)
plt.plot(x3, y3)
plt.title('第3个图', fontfamily='SimHei')plt.suptitle('超级标题', fontfamily='SimHei')
plt.show() # 全部显示
四 plt.scatter()
--> 绘制散点图
1 函数语法
函数语法
plt.scatter(x, y, # 数据点坐标(必需)s=36, # 点大小(默认36,即6x6像素)c='#1f77b4', # 默蓝色marker='o', # 默认圆圈alpha=1.0, # 默认不透明linewidths=1.5, # 默认边框宽度1.5edgecolors='face' # 默认边框颜色同填充色
)
2 创建散点图
代码示例
import numpy as np
import matplotlib.pyplot as pltx = [3.85,8.89,1.9,6.04,5.37,2.65,0.31,7.62,9.69,4.46,0.92,3.27,7.12,4.15,8.45,5.59,9.27,6.52,1.47,7.35]
y = [0.71,-3.12,4.12,-2.12,-4.52,3.8,2.38,-1.35,-4.11,-3.98,3.12,0.12,-2.35,-4.12,-3.89,-4.62,-4.21,-3.01,4.35,-2.45]
plt.scatter(x, y)
plt.show()
实现效果
3 点标记、点大小、透明度
散点图也可以设置点的大小与透明度,而且点的大小可以指定一串数值,也就是每个点的大小可以不是固定的
4 设置点的颜色(新知识:颜色映射)
注意:
- 如果同时指定
c
和color
,c
参数优先级更高- 使用
cmap
时必须提供数值型c
参数
4.1 默认颜色 --> 当不指定时,默认颜色
在使用plt.scatter()
绘制散点图的时候,会默认为蓝色(#1f77b4
),当使用了多个plt.scatter()
绘制散点图的时候,且不指定颜色,会按照如下顺序分配颜色:
1. #1f77b4 (蓝色)
2. #ff7f0e (橙色)
3. #2ca02c (绿色)
4. #d62728 (红色)
5. #9467bd (紫色)
6. #8c564b (棕色)
7. #e377c2 (粉色)
8. #7f7f7f (灰色)
- 第1-8个 scatter() 调用:依次使用上述颜色
- 从第9个调用开始:重新从第1个颜色(蓝色)开始循环
手动指定颜色:
4.2 颜色名称/缩写
- 基础色:
'r'
,'g'
,'b'
,'c'
,'m'
,'y'
,'k'
,'w'
- 所有合法颜色名
代码示例
plt.subplot(1, 3, 1)
plt.scatter(x, y, c='red') # 英文名称
plt.subplot(1, 3, 2)
plt.scatter(x+1, y+1, c='r') # 缩写 --> 相当于 red
plt.subplot(1, 3, 3)
plt.scatter(x+2, y+2, c='skyblue') # CSS4/CSS颜色名称
plt.show()
显示效果
4.3 十六进制颜色码
plt.scatter(x, y, c='#1f77b4') # 默认蓝色
4.4 RGB/RGBA元组
注意
当指定一个RGB或RGBA颜色时,用参数color
而不是参数c
刚开始我用的c
,给我弹警告了,我才知道当指定单个颜色(1, 0, 0, 0.5) 的时候,系统无法立即确定意图是:
- 想为所有点设置同一颜色(RGBA),还是
- 想用四个数值做颜色映射(如果数据点恰好也是4个)
如果想要指定多个RGB颜色,需要写成这样
c=[(r1,g1,b1,a1), (r2,g2,b2,a2), ...]
plt.scatter(x-2, y-2, color=(1, 0, 0)) # 纯红 (RGB 0-1)
plt.scatter(x, y, color=(0.2, 0.4, 0.6)) # 自定义RGB
plt.scatter(x+2, y+2, color=(1, 0, 0, 0.5)) # 半透明红 (RGBA)
4.5 灰度值
也可以设置灰度值,不止是纯颜色
plt.scatter(x, y, c='0.5') # 50%灰(字符串格式,字符串也是小数的形式)
plt.show()
4.6 颜色映射(数值 --> 颜色)
顾名思义,就是数值映射为颜色
4.6.1 基础用法
values = np.random.rand(20) # 生成范围数量为20,数字在0-1之间的随机数
plt.scatter(x, y, c=values, cmap='viridis') # 生成随机颜色的散点图
plt.colorbar() # 显示颜色条
plt.show()
颜色条的范围也并非是0~1,这个取决于数值范围,比如数值改成1-100之间的数值:
values2 = np.random.randint(1, 101, size=20)
plt.scatter(x, y, c=values2, cmap='viridis') # 生成随机颜色的散点图
plt.colorbar() # 显示颜色条
plt.show()
4.6.2 控制数值范围
data = np.random.randint(0, 200, 100) # 数值0-200
plt.scatter(x, y, c=data, cmap='viridis', # 色图映射vmin=0, # 最小值映射到色表起点vmax=200) # 最大值映射到色表终点
4.6.3常用色表
类型 | 色表名 | 特点 |
---|---|---|
连续型 | 'viridis' | 蓝-青-黄渐变(推荐)–> 最常用 |
'plasma' | 紫-红-黄(高对比度) | |
发散型 | 'coolwarm' | 蓝-白-红(正负值对比) |
离散型 | 'tab10' | 10种区分色(分类数据) |
4.6.4 自动归一化机制
- 颜色映射的数值并没有一个明确的限制,系统会自动处理任意范围的数值,数据会被自动归一化到 [0,1] 范围,再映射到色表,比如指定数据是
1-100
,1
自动归一为0
,而100
自动归一到1
- 无论数据范围是 0-1、1-100 还是 -500~500,Matplotlib 都会通过以下公式自动归一化:
归一化值 = (当前值 - vmin) / (vmax - vmin)
- 默认行为:不指定 vmin/vmax 时,系统默认用指定数据的 最小值 和 最大值 作为范围,如下举例:
最小值为50,最大值为200,所以就算不指定,也是默认为vmin=50, vmax=200
data = np.array([x for x in range(50, 201, 2)]) # 范围50-200
plt.scatter(x, y, c=data, cmap='viridis')
# 等价于:
# plt.scatter(x, y, c=data, cmap='viridis', vmin=50, vmax=200)
4.7 为每个点单独指定颜色
# 每个点不同颜色(数组长度需与数据一致)
colors = ['red', 'blue', 'green'] # 颜色列表
plt.scatter([1,2,3], [1,2,3], c=colors)# 或用RGB数组
rgb_colors = np.random.rand(100, 3) # 生成100个随机RGB颜色
plt.scatter(x, y, c=rgb_colors)
5 示例
import numpy as np
import matplotlib.pyplot as plt
plt.subplot(1, 2, 1)
x = np.array([3.85,8.89,1.9,6.04,5.37,2.65,0.31,7.62,9.69,4.46,0.92,3.27,7.12,4.15,8.45,5.59,9.27,6.52,1.47,7.35])
y = np.array([0.71,-3.12,4.12,-2.12,-4.52,3.8,2.38,-1.35,-4.11,-3.98,3.12,0.12,-2.35,-4.12,-3.89,-4.62,-4.21,-3.01,4.35,-2.45])
sizes = np.random.randint(1, 202, size=20) # 设置点的大小
colors = np.random.rand(20) # 设置颜色
alphas = np.random.rand(20) # 设置不透明度
# plt.scatter(x, y, s=sizes, c=colors, marker='d', alpha=alphas)
plt.colorbar() # 显示颜色条
plt.title('图1', fontfamily='SimHei')# 图2
plt.subplot(1, 2, 2)
x2 = np.random.randint(1, 200, size=90) # 设置点的大小
y2 = np.random.randint(1, 200, size=90) # 设置点的大小
sizes2 = np.random.randint(1, 202, size=90) # 设置点的大小
colors2 = np.random.rand(90) # 设置颜色
alphas2 = np.random.rand(90) # 设置不透明度
plt.scatter(x2, y2, s=sizes2, c=colors2, marker='o', alpha=alphas2)
plt.title('图2', fontfamily='SimHei')
plt.colorbar() # 显示颜色条
plt.show()
五 plt.bar() / plt.barh()
--> 绘制柱状图
1 函数语法
1.1 plt.bar()
plt.bar(x, height, # 数据位置和高度(必需)width=0.8, # 柱宽度(默认0.8)bottom=None, # 柱底部的y坐标(默认从0开始)color=None, # 柱颜色(默认使用样式循环色)edgecolor='none', # 边框颜色(默认无边框)linewidth=1.0, # 边框宽度(默认1.0)alpha=1.0, # 透明度(默认不透明)align='center' # 对齐方式(默认居中对齐) 还有 left 和 right
)
1.2 plt.barh()
plt.barh(y, width, # 数据位置和宽度(必需)height=0.8, # 条形高度(默认0.8)left=None, # 条形左侧的x坐标(默认从0开始)color=None, # 条形颜色(默认使用样式循环色)edgecolor='none', # 边框颜色(默认无边框)linewidth=1.0, # 边框宽度(默认1.0)alpha=1.0, # 透明度(默认不透明)align='center' # 对齐方式(默认居中对齐) 还有 left 和 right
)
1.3 区别
- 方向
- bar():垂直(x=位置,height=高度)
- barh():水平(y=位置,width=宽度)
- 柱高调节
- bar() 用 width 调柱宽
- barh() 用 height 调柱高
2 设置颜色
与 plt.scatter() 类似,但部分参数用法不同
2.1 基础颜色
-
单柱统一颜色
plt.bar(x, height, color='skyblue') # 预定义颜色名 plt.bar(x, height, color='#1f77b4') # 十六进制 plt.bar(x, height, color=(0.2, 0.4, 0.8)) # RGB元组(0~1)
-
多柱不同颜色
colors = ['red', 'green', 'blue'] plt.bar(x, height, color=colors) # 颜色列表长度需与数据一致
2.2 颜色映射(数值→颜色)
适用场景:根据数值大小自动分配颜色(如热力图效果)
values = np.random.rand(10) # 生成0~1的随机值
plt.bar(x, height, color=plt.cm.viridis(values)) # 使用viridis色映射
plt.colorbar() # 显示颜色条
3 堆叠柱状图
通过 bottom
(垂直)或 left
(水平)参数实现:
也就是说,在画第二个图的时候,从上一个图的顶部为起始
# 垂直堆叠
plt.bar(x, height1, color='r', label='A')
plt.bar(x, height2, bottom=height1, color='b', label='B') # 在A上堆叠B# 水平堆叠
plt.barh(y, width1, color='r', label='A')
plt.barh(y, width2, left=width1, color='b', label='B') # 在A右侧堆叠B
4 分组柱状图
调整 x
坐标和 width
实现分组:
x = np.arange(3) # 0, 1, 2
width = 0.3 # 柱宽plt.bar(x - width/2, height1, width, label='Group1')
plt.bar(x + width/2, height2, width, label='Group2')
plt.xticks(x, ['A', 'B', 'C']) # 设置x轴标签
5 分组 + 颜色映射 示例
import numpy as np
import matplotlib.pyplot as pltx = ['A', 'B', 'C'] # x轴
height1 = [5, 20, 15]
height2 = [1, 12, 2]# 堆叠柱状图 + 颜色映射
plt.figure(figsize=(10, 4)) # 设置画布大小,长为10,宽为4 单位英寸
plt.bar(x, height1, color='g', edgecolor='black', label='1')
plt.bar(x, height2, bottom=height1, color='orange', edgecolor='black', label='2')
plt.legend() # 显示图例
plt.title('叠堆柱状图 + 颜色映射', fontfamily='SimHei')
plt.show()
六 plt.hist
--> 绘制直方图
1 函数语法
plt.hist(x, # 输入数据(必需)bins=10, # 柱子数量或边界(默认10)range=None,# 数据范围(默认(min,max))density=False, # 是否显示概率密度(默认False)color=None, # 柱子颜色edgecolor='none', # 边框颜色(默认无边框)alpha=1.0, # 透明度align='mid', # 对齐方式('left','mid','right')orientation='vertical' # 方向('vertical'或'horizontal')
)
2 代码示例
import numpy as np
import matplotlib.pyplot as pltdata = np.random.normal(0, 1, 1000) # 生成1000个正态分布随机数
plt.hist(data, bins=30, color='skyblue', edgecolor='black', alpha=0.7)
plt.title('正态分布直方图', fontfamily='SimHei')
plt.xlabel('数值', fontfamily='SimHei')
plt.ylabel('频数', fontfamily='SimHei')
plt.show()
七 plt.pie
--> 绘制饼图
1 函数语法
plt.pie(x, # 数据数组(必需)labels=None, # 各扇区的标签colors=None, # 自定义颜色列表autopct=None, # 百分比显示格式startangle=90, # 起始角度(默认12点钟方向)shadow=False, # 是否添加阴影explode=None, # 突出某些扇区pctdistance=0.6, # 百分比标签距圆心距离labeldistance=1.1, # 文本标签距圆心距离wedgeprops=None, # 扇区属性(如边框)textprops=None, # 文本属性(如字体大小)center=(0, 0), # 圆心位置radius=1, # 饼图半径frame=False, # 是否显示外框rotatelabels=False, # 旋转标签以适应扇区
)
2 参数说明
参数 | 类型 | 默认值 | 作用 | 示例值 | 注意事项 |
---|---|---|---|---|---|
x | array | 必填 | 数据数组(决定各扇区大小) | [15, 30, 45] | 数据总和会自动归一化为100% |
labels | list | None | 扇区的文本标签 | ['A', 'B', 'C'] | 1. 长度需与x 的长度保持一致2. 空标签用 '' 3. labels 参数必须是1个数组,每个楔形(扇形)都有一个标签(数组元素)与之对应 |
colors | list | 循环色表 | 也可以自定义扇区颜色 | ['#ff9999', 'gold', 'lightblue'] | 1 支持颜色名、十六进制、RGB元组 2 如果指定了参数,则必须是一个数组,且长度与x的长度一致 |
autopct | str | None | 百分比显示格式 | '%1.1f%%' (1位小数) | 需包含%% 表示百分号 |
startangle | float | 90 | 起始角度(度) | 45 (从2点钟方向开始) | 0度=3点钟方向,逆时针旋转 |
shadow | bool | False | 是否添加阴影 | True | 阴影方向固定为右下角 |
explode | list | None | 突出扇区(偏移比例) | [0, 0.1, 0] | 1 长度需与x 一致2 如果指定参数,则必须是数组,数组内容相当于楔形与圆心的距离 |
pctdistance | float | 0.6 | 百分比标签位置 | 0.8 (靠近边缘) | 0.5=圆心,1.0=边缘 |
labeldistance | float | 1.1 | 文本标签位置 | 1.3 (更远离圆心) | 可设为None 隐藏标签 |
wedgeprops | dict | None | 扇区样式控制 | {'width':0.3, 'edgecolor':'black'} | 1width 控制环宽(甜甜圈图)2 写 1 和None 的效果一样,中间是没有洞的 |
textprops | dict | None | 文本样式控制 | {'fontsize':12, 'color':'red'} | 影响标签和百分比文本 |
center | tuple | (0,0) | 圆心坐标 | (0.5, 0.5) | 需配合radius 调整位置 |
radius | float | 1 | 饼图半径 | 1.2 (放大) | 值越大图形越大 |
frame | bool | False | 是否显示外框 | True | 框线颜色同坐标轴 |
rotatelabels | bool | False | 旋转标签适应扇区 | True | 适合小角度扇区 |
plt.legend
同样可以设置图例
3 代码示例
示例中引入的库皆为:
import numpy as np
import matplotlib.pyplot as plt
示例中的x数组皆为:
x = np.array([10, 40, 50])
3.1 基础创建
plt.pie(x, labels=['A', 'B', 'C', 'D'])
plt.show()
2. 突出显示B+阴影
plt.pie(x, explode=[0, 0.1, 0, 0], shadow=True)
plt.show()
3. 环形饼图(甜甜圈图)
# 图1 --> 甜甜圈
plt.subplot(1, 3, 1)
plt.pie(x, labels=['A', 'B', 'C', 'D'], wedgeprops={'width': 0.5}) # width控制环宽
# 图2 --> 中间无洞
plt.subplot(1, 3, 2)
plt.pie(x, labels=['A', 'B', 'C', 'D'], wedgeprops=None)
# 图3 --> 中间无洞
plt.subplot(1, 3, 3)
plt.pie(x, labels=['A', 'B', 'C', 'D'], wedgeprops={'width': 1})
plt.show()