写在前面:
计算机很呆很强大,你必须要一步一步耐心的告诉他你需要他干什么
关于数据可视化
(下文所使用的示例库为:matplotlib)
在python中,数据可视化就是简单的画图(不要被感觉很宏大其实很渺小的学术词所吓到)
因此我们已知需要画图,我们必须要让我们的计算机知道“他需要搬出画图工具”这件事,在python中如何告知呢?那就要用到我们就需要进行:
第三方库导入
import matplotlib.pyplot as plt #计算机请你拿出画图工具喔~
对第三方库导入还不熟悉的童鞋可以参考这篇:Python篇(基础):在Python导入第三方库的标准格式-CSDN博客
第三方库导入简单讲解
- matplotlib:Python 最著名的 数据可视化库,用于绘制各种图表(折线图、散点图、柱状图等)
- pyplot:matplotlib的核心子模块,提供 MATLAB 风格的绘图接口,并且其中还包含常用绘图函数:如plot( ),scatter( ),bar( ),show( )等等
- as plt:为 matplotlib.pyplot 设置别名plt,为了简化代码,使得plt.函数名=matplotlib.pyplot.函数名
)
怎么画图呢?我们既然导入了matplotlib库,我们就可以开始画类似于折线图,散点图,柱状图等等(可不是说乱涂乱画的那个画图喔),那我们先来展示
散点图 scatter()
我们先有一个散点图的概念,这样方便我们理解其本身以及代码:
散点图的特点
我们不难发现,我们在绘图的时候需要注意的几个关键点:
双变量关系:X轴和Y轴分别表示两个变量(如自变量和因变量)
数据的特点:点的大小,颜色,形状不同
数据之间的相关性:点的分布方向显示正相关/负相关
还有一些有关于表格外表的变量:表格名称等
我们再来看散点图本身的代码:
绘画散点图的代码
plt.scatter(x, y, s, c, marker, …)
简单的,我们把plt.scatter()定义为前缀,那么后缀就是括号内的内容:
前缀的内容
plt代表我们让计算机拿出来的工具,后缀.scatter是“散”的意思,放在一起就是需要用plt工具去画散点图的意思。
后缀的内容
那些是目标散点图的具体参数,可以理解为要告诉计算机我要让他画一个什么样的散点图。
那么我们不难理解,绘图的重点在后缀那些影响图本身的参数上,下面来介绍内置参数
常用的内置参数
核心参数(绘图必备)
参数名 | 变量类型 | 功能说明 |
---|---|---|
x | 数组 | 散点的横坐标数据(必需)。 |
y | 数组 | 散点的纵坐标数据(必需)。 |
s | 标量或数组 | 散点的大小(面积),默认值 20 。若为数组,则每个点独立设置大小。 |
c | 颜色字符串、数组或RGB | 散点的颜色。可接受:<br>• 单一颜色(如 "red" )<br>• 颜色数组(长度 n )<br>• RGB/RGBA 数组。 |
marker | 字符串 | 散点的形状,如:<br>• "o" :圆形(默认)<br>• "s" :方形<br>• "^" :三角形。 |
样式控制参数(改变外观)
参数名 | 变量类型 | 功能说明 |
---|---|---|
alpha | 浮点数 (0-1) | 散点的透明度(0 完全透明,1 不透明)。 |
edgecolors | 颜色或字符串 | 散点边缘颜色:<br>• "face" :与填充色相同(默认)<br>• "none" :无边缘。 |
linewidths | 标量或数组 | 散点边缘线宽(单位:像素)。 |
cmap | Colormap对象 | 颜色映射表(如 "viridis" ),仅当 c 为数值数组时生效。 |
label | 字符串 | 设置图例标签(需配合 plt.legend() 使用)。 |
高级参数(精细化控制)
参数名 | 变量类型 | 功能说明 |
---|---|---|
norm | Normalize对象 | 归一化 c 的数值范围至 [0,1] ,配合 cmap 使用(覆盖 vmin/vmax )。 |
vmin , vmax | 标量 | 手动设置 c 的颜色映射范围(若 norm 存在则失效)。 |
plotnonfinite | 布尔值 | 是否绘制非数值点(如 |
如何输出图像(需要严格执行先后顺序)
那么最后的问题来了:我们如何让计算机输出他绘画的图呢?
我们需要分解步骤(需要严格执行先后顺序):
1,保存图片
plt.savefig(
'high_quality_plot.png',# 图片名称
dpi=300, # 提高分辨率(默认100)
bbox_inches='tight', # 自动去除多余白边 ✔️
transparent=True, # 透明背景(适合网页)
facecolor='lightblue' # 自定义背景色
)
2,展示图片
plt.show() # 显示图形
ps:为什么输出不了中文的标题?可以看这篇:
Python基础篇:数据可视化的图片为什么不能输出中文?-CSDN博客
散点图与随机数的关系:
散点图离不开随机数,为什么需要随机数?主要出于以下目的:
模拟真实数据分布(无真实数据时)
- 作用:当缺乏真实数据集时,随机数可生成符合特定分布(如正态分布、均匀分布)的模拟数据,用于展示散点图的基本功能。
- 示例:
此类数据能直观展示变量间的相关性(如线性、非线性关系)。import numpy as np # 生成正态分布数据(均值=5,标准差=1) x = np.random.normal(5, 1, 1000) y = np.random.normal(10, 2, 1000) plt.scatter(x, y)
测试算法或模型的鲁棒性
- 作用:在机器学习或统计分析中,需验证模型对噪声的敏感度。随机数生成的数据可添加可控噪声(如异常值),测试模型的稳定性。
- 案例:
生成包含随机异常值的数据集,观察回归直线是否偏移,评估模型抗干扰能力。
探索数据关系(多变量场景)
- 作用:多元回归分析中,散点图可能无法直接展示多变量间的复杂关系(如交互效应)。随机生成的数据可辅助设计实验,分离变量影响。
- 关键点:
- 单一散点图仅能反映两个变量的关系,多变量需结合其他方法(如三维散点图或统计指标)。
- 例如:即使
y=ax1+bx2+cx3
存在线性关系,单独画y-x1
散点图可能显示弱相关性。
教学与演示的可重复性
- 作用:通过固定随机种子(如
np.random.seed(42)
),确保每次生成的散点图数据一致,便于教学演示和结果复现。 - 代码示例:
np.random.seed(0) # 固定随机种子 x = np.random.rand(100) y = np.random.rand(100)
调试与可视化优化
- 作用:随机数据可快速验证图表自定义效果(如颜色、大小、透明度),避免因真实数据复杂而干扰调试。
- 常见调试项:
- 点的大小(
s
参数)与随机数关联:sizes = np.random.rand(100) * 100
- 颜色映射(
c
和cmap
参数)的视觉测试
- 点的大小(
举个例子
可根据上述内容来理解下列代码:
import matplotlib.pyplot as plt
import numpy as np
# 设置随机种子保证可重现性
np.random.seed(42)
# 创建数据
n = 50 # 每组50个数据点
x1 = np.random.normal(0, 1, n) # 组1 X值
y1 = np.random.normal(0, 1, n) # 组1 Y值
x2 = np.random.normal(3, 1, n) # 组2 X值
y2 = np.random.normal(3, 1, n) # 组2 Y值
# 创建图形和坐标轴
plt.figure(figsize=(10, 7))
# 绘制第一组数据 - 用星星表示
plt.scatter(x1, y1,
s=120, # 点的大小
c='royalblue', # 颜色
marker='*', # 星星标记
edgecolor='navy', # 边框颜色
alpha=0.8, # 透明度
label='团队A') # 图例标签
# 绘制第二组数据 - 用圆圈表示
plt.scatter(x2, y2,
s=100, # 点的大小
c='coral', # 颜色
marker='o', # 圆圈标记
edgecolor='darkred', # 边框颜色
alpha=0.8, # 透明度
label='团队B') # 图例标签
# 添加标题和标签
plt.title('text', fontsize=16, pad=20)
plt.xlabel('Efficiency index', fontsize=12)
plt.ylabel('Quality index', fontsize=12)
# 添加图例和网格
plt.legend(fontsize=12, loc='upper left')
plt.grid(True, linestyle='--', alpha=0.3)
# 设置坐标轴范围,使两组数据都清晰可见
plt.xlim(-3, 6)
plt.ylim(-3, 6)
# 添加平均线
plt.axvline(x=np.mean(x1), color='royalblue', linestyle='--', alpha=0.3)
plt.axvline(x=np.mean(x2), color='coral', linestyle='--', alpha=0.3)
# 添加水平中线
plt.axhline(y=0, color='gray', linewidth=0.5, alpha=0.5)
plt.axvline(x=0, color='gray', linewidth=0.5, alpha=0.5)
# 显示图形
plt.tight_layout()
plt.savefig('scatter_plot.png', dpi=300,bbox_inches='tight',transparent=False)
plt.show()
生成结果如下: