当前位置: 首页 > news >正文

Python数据可视化之散点图(实战篇---从入门到精通)

1. 为什么选择散点图?

散点图是数据分析中最基础也最实用的可视化工具之一。我第一次接触散点图是在分析电商用户行为时,当时需要找出用户年龄和消费金额之间的关系。散点图就像是一个放大镜,能让你一眼看出数据中隐藏的模式。

举个例子,假设你手上有1000条用户数据,包含年龄和月消费金额。用Excel表格看这些数字,你可能会头晕眼花。但把这些数据点画在散点图上,立刻就能发现:25-35岁的用户消费最活跃,形成明显的密集区域;而50岁以上用户的点则分散在较低位置。这种直观的洞察,是表格数据永远给不了的。

2. 环境准备与数据生成

2.1 三件套安装指南

工欲善其事必先利其器,我们先搞定三个必备工具:

  • NumPy:数据生成的瑞士军刀
  • Pandas:数据处理的全能选手
  • Matplotlib:可视化界的扛把子

安装命令很简单:

pip install numpy pandas matplotlib

如果你遇到安装慢的问题,可以试试国内镜像源:

pip install numpy pandas matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple

2.2 创建模拟数据集

让我们生成一份更接近真实场景的数据。假设我们要分析某电商平台的用户数据:

import numpy as np import pandas as pd # 设置随机种子保证结果可复现 np.random.seed(42) # 生成1000个18-70岁的用户年龄 ages = np.random.randint(18, 70, size=1000) # 生成消费金额:年龄越大消费越低,但存在随机波动 consumption = 3000 - ages * 20 + np.random.normal(0, 500, size=1000) # 创建DataFrame df = pd.DataFrame({'Age': ages, 'Consumption': consumption}) # 查看前5行 print(df.head())

这份数据的特点是:

  • 年龄范围:18-70岁
  • 消费金额与年龄呈负相关
  • 加入了随机噪声模拟真实情况

3. 基础散点图绘制

3.1 你的第一个散点图

让我们用最简单的代码画出散点图:

import matplotlib.pyplot as plt plt.figure(figsize=(10, 6)) plt.scatter(df['Age'], df['Consumption']) plt.title('Age vs Consumption') plt.xlabel('Age') plt.ylabel('Monthly Consumption (CNY)') plt.grid(True) plt.show()

这段代码虽然简单,但已经包含了散点图的核心要素:

  • figsize:控制图形大小,10×6是比较适合报告的尺寸
  • scatter:核心绘图函数
  • title/xlabel/ylabel:让图表更易读
  • grid:添加网格线方便观察数据分布

3.2 第一次优化:解决重叠问题

当数据点很多时,你会发现点都挤在一起。这时候可以:

  1. 调整点的大小(s参数)
  2. 设置透明度(alpha参数)
  3. 使用边缘色(edgecolor)

改进后的代码:

plt.figure(figsize=(10, 6)) plt.scatter(df['Age'], df['Consumption'], s=20, alpha=0.6, edgecolor='white') plt.title('Age vs Consumption (Optimized)') plt.xlabel('Age') plt.ylabel('Monthly Consumption (CNY)') plt.grid(True, alpha=0.3) plt.show()

4. 进阶技巧:添加分类维度

4.1 按性别分类着色

假设我们新增了性别数据:

# 随机生成性别数据 genders = np.random.choice(['Male', 'Female'], size=1000) df['Gender'] = genders

现在可以用不同颜色区分性别:

colors = {'Male': 'blue', 'Female': 'red'} plt.figure(figsize=(10, 6)) for gender in ['Male', 'Female']: subset = df[df['Gender'] == gender] plt.scatter(subset['Age'], subset['Consumption'], color=colors[gender], label=gender, s=20, alpha=0.6) plt.title('Age vs Consumption by Gender') plt.xlabel('Age') plt.ylabel('Monthly Consumption (CNY)') plt.legend() plt.grid(True, alpha=0.3) plt.show()

4.2 添加趋势线

要更清楚地看到年龄和消费的关系,可以添加趋势线:

from scipy.stats import linregress # 计算线性回归 slope, intercept, r_value, p_value, std_err = linregress(df['Age'], df['Consumption']) plt.figure(figsize=(10, 6)) plt.scatter(df['Age'], df['Consumption'], s=20, alpha=0.6) plt.plot(df['Age'], intercept + slope * df['Age'], 'r', label=f'Y = {intercept:.1f} + {slope:.1f}X') plt.title('Age vs Consumption with Trendline') plt.xlabel('Age') plt.ylabel('Monthly Consumption (CNY)') plt.legend() plt.grid(True, alpha=0.3) plt.show()

5. 专业级美化技巧

5.1 使用Seaborn风格

Matplotlib的默认样式比较简陋,可以改用Seaborn风格:

import seaborn as sns sns.set_style("whitegrid") plt.figure(figsize=(10, 6)) sns.scatterplot(data=df, x='Age', y='Consumption', hue='Gender', palette=['blue', 'red'], alpha=0.6, s=50) plt.title('Professional Style with Seaborn') plt.xlabel('Age') plt.ylabel('Monthly Consumption (CNY)') plt.show()

5.2 添加边际分布图

想要同时看到单变量分布?试试边际分布图:

sns.set_style("whitegrid") g = sns.JointGrid(data=df, x='Age', y='Consumption', height=8) g.plot_joint(sns.scatterplot, hue=df['Gender'], palette=['blue', 'red'], alpha=0.6) g.plot_marginals(sns.histplot, kde=True) plt.suptitle('Age vs Consumption with Marginal Distributions') plt.tight_layout() plt.show()

6. 实战案例:用户分群分析

6.1 识别高价值用户

假设我们定义:

  • 高价值用户:消费 > 2500元
  • 普通用户:消费 ≤ 2500元
df['User_Type'] = np.where(df['Consumption'] > 2500, 'High Value', 'Normal') plt.figure(figsize=(10, 6)) for user_type in ['High Value', 'Normal']: subset = df[df['User_Type'] == user_type] plt.scatter(subset['Age'], subset['Consumption'], label=user_type, alpha=0.6) plt.axhline(y=2500, color='gray', linestyle='--', alpha=0.5) plt.title('Identifying High Value Users') plt.xlabel('Age') plt.ylabel('Monthly Consumption (CNY)') plt.legend() plt.grid(True, alpha=0.3) plt.show()

6.2 添加注释标记

想要突出显示特定数据点:

highlight = df.nlargest(3, 'Consumption') plt.figure(figsize=(10, 6)) plt.scatter(df['Age'], df['Consumption'], alpha=0.4) plt.scatter(highlight['Age'], highlight['Consumption'], color='red', s=100, label='Top 3') for i, row in highlight.iterrows(): plt.annotate(f"{row['Consumption']:.0f}元", (row['Age'], row['Consumption']), textcoords="offset points", xytext=(0,10), ha='center') plt.title('Highlighting Top Spenders') plt.xlabel('Age') plt.ylabel('Monthly Consumption (CNY)') plt.legend() plt.show()

7. 导出与分享

7.1 保存高清图片

plt.figure(figsize=(10, 6)) plt.scatter(df['Age'], df['Consumption'], alpha=0.6) plt.title('Final Version for Report') plt.xlabel('Age') plt.ylabel('Monthly Consumption (CNY)') # 保存为高清PNG plt.savefig('age_consumption.png', dpi=300, bbox_inches='tight')

7.2 交互式探索

如果你需要交互功能,可以试试Plotly:

import plotly.express as px fig = px.scatter(df, x='Age', y='Consumption', color='Gender', hover_data=['User_Type'], title='Interactive Scatter Plot') fig.show()
http://www.jsqmd.com/news/662873/

相关文章:

  • 从零搭建Adams-Matlab机器人联合仿真环境:一份详尽的配置指南
  • 别再手动传文件了!手把手教你用Alfresco搭建企业文档共享中心(含Word在线编辑避坑指南)
  • 从PC到移动端:高通安卓UEFI的架构演进与核心设计
  • ORAN专题系列-23:O-RU全球生态格局与新兴势力深度解析
  • 嵌入式音频延迟优化:如何为你的ARM Linux设备(如树莓派)调优ALSA Buffer参数
  • 全志A133安卓10设备GPS功能移植实战:从HAL层配置到天线选型避坑全记录
  • 保姆级教程:用Python脚本实现URSim机器人TCP通讯控制(附完整代码)
  • RDKit终极指南:3个核心功能解析与5大实战应用场景
  • Xilinx Video IP(二)AXI4-Stream视频数据流优化与FIFO深度设计
  • 客服效率革命:如何用咕咕文本实现秒级响应
  • 【OpenClaw从入门到精通】第66篇:Skill开发进阶——从零打造一个跨境选品Skill(附完整代码)(2026实测版)
  • Python在图片上画线:从基础到进阶的实用指南
  • 学Simulink——基于Simulink的感应电机间接转子磁场定向控制​
  • SAP运维实战 - 番号范围缺失引发的NR751错误:从RF_BELEG R100到FBN1的修复之旅
  • 从抛硬币到投资组合:独立随机变量‘可加性’在现实世界中的3个妙用
  • 从哈勃到韦伯:J2000坐标系在太空望远镜观测中的关键作用与实战案例
  • 从.nii文件到发表级配图:我的fMRI脑图(ROI)美化全流程(附Mango调色技巧)
  • 不止于烧录:用J-Flash深度调试你的HC32L110程序(从下载到在线调试全流程)
  • 16. C++17新特性-std::filesystem (文件系统库)
  • 终极Sketch Measure插件教程:如何彻底终结设计开发沟通难题
  • 从RAM到FLASH:DSP28335工程中printf串口打印的两种内存配置实战
  • 保姆级教程:在Ubuntu 20.04上搭建高通Camx源码阅读与调试环境(含Source Insight配置)
  • 如何让AirPods在Windows上获得完整功能体验:AirPodsDesktop全面指南
  • 强化学习论文(A3C)
  • 终极指南:2026 年最值得关注的 10 个 AI Agent Harness Engineering 开源项目
  • STM32 HAL库驱动MAX31855:从SPI配置到负温度精准读取的实战解析
  • 更加现代的Deep Learning接入SLAM的方法
  • Arduino随机数探秘:从random()到randomSeed()的实战指南
  • 20252817 2025-2026-2 《网络攻防实践》实践五报告
  • music21节奏与时长管理:精确控制音乐时间要素