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

别再只用散点图了!用make_circles和make_moons生成的数据,教你玩转5种可视化技巧(附完整代码)

别再只用散点图了!用make_circles和make_moons生成的数据,教你玩转5种可视化技巧(附完整代码)

当我们用make_circlesmake_moons生成数据时,大多数人止步于基础的散点图展示。但数据可视化的魅力远不止于此——通过调整参数和组合不同图表技术,这些简单的二维数据集可以变成探索数据特性的强大工具。下面我将分享5个能立即提升你分析深度的可视化技巧,每个都附带可直接运行的代码。

1. 3D投影:揭示隐藏的维度结构

虽然原始数据是二维的,但通过添加第三个维度(比如到原点的距离或类别概率),我们可以发现新的模式。使用mpl_toolkits.mplot3d可以轻松实现:

from mpl_toolkits.mplot3d import Axes3D X, y = make_moons(n_samples=400, noise=0.1) z = np.sqrt(X[:,0]**2 + X[:,1]**2) # 计算到原点的距离 fig = plt.figure(figsize=(10,6)) ax = fig.add_subplot(111, projection='3d') scatter = ax.scatter(X[:,0], X[:,1], z, c=y, cmap='viridis', s=50, edgecolor='k') ax.set_xlabel('X坐标') ax.set_ylabel('Y坐标') ax.set_zlabel('到原点距离') plt.title('3D投影的月牙数据', pad=20) plt.show()

这种可视化特别适合展示:

  • 类别间的分离程度:观察不同类别在第三维度的分布差异
  • 噪声影响:通过调整noise参数,直观看到数据点在高维空间的分散情况

提示:尝试将z值改为np.exp(-(X[:,0]**2 + X[:,1]**2))可以得到高斯核转换后的效果

2. 动态交互:用Plotly实现可探索的可视化

静态图表有其局限,而交互式可视化允许我们:

  • 缩放查看密集区域
  • 悬停查看数据点详情
  • 动态切换不同视角
import plotly.express as px X, y = make_circles(n_samples=400, noise=0.1, factor=0.3) df = pd.DataFrame({'x':X[:,0], 'y':X[:,1], 'label':y, 'radius':np.sqrt(X[:,0]**2 + X[:,1]**2)}) fig = px.scatter_3d(df, x='x', y='y', z='radius', color='label', size='radius', hover_data=['x', 'y'], color_continuous_scale=px.colors.sequential.Viridis, title='交互式环形数据探索') fig.update_layout(scene_zaxis_type="log") fig.show()

关键交互功能包括:

  • 鼠标拖拽旋转3D视图
  • 滚轮缩放
  • 点击图例切换类别显示
  • 悬停显示坐标值

3. 参数对比:用子图网格展示噪声和比例因子的影响

理解参数如何改变数据分布是机器学习的重要基础。通过plt.subplots创建对比网格:

noise_levels = [0.05, 0.1, 0.2, 0.3] factors = [0.2, 0.4, 0.6, 0.8] fig, axes = plt.subplots(len(noise_levels), len(factors), figsize=(15,12), sharex=True, sharey=True) for i, noise in enumerate(noise_levels): for j, factor in enumerate(factors): X, y = make_circles(n_samples=200, noise=noise, factor=factor) axes[i,j].scatter(X[:,0], X[:,1], c=y, cmap='coolwarm', s=30, alpha=0.7) axes[i,j].set_title(f'噪声:{noise}, 比例:{factor}', fontsize=9) plt.tight_layout() plt.suptitle('不同噪声和比例因子下的数据分布比较', y=1.02) plt.show()

这个可视化帮助我们理解:

  • 噪声(noise):值越大,类别边界越模糊
  • 比例因子(factor):控制内外圆半径比,影响类别间距离

4. 密度热图:展示数据分布的统计特性

当数据点非常密集时,散点图会变得难以解读。热图与等高线的组合能更好地展示分布密度:

from scipy.stats import gaussian_kde X, y = make_moons(n_samples=1000, noise=0.15) # 计算核密度估计 kde = gaussian_kde(X.T) xgrid = np.linspace(min(X[:,0]), max(X[:,0]), 100) ygrid = np.linspace(min(X[:,1]), max(X[:,1]), 100) Xgrid, Ygrid = np.meshgrid(xgrid, ygrid) Z = kde(np.vstack([Xgrid.ravel(), Ygrid.ravel()])) plt.figure(figsize=(10,8)) plt.contourf(Xgrid, Ygrid, Z.reshape(Xgrid.shape), levels=20, cmap='Purples') plt.colorbar(label='点密度') # 叠加原始数据点 for class_value in [0,1]: mask = y == class_value plt.scatter(X[mask,0], X[mask,1], label=f'类别 {class_value}', s=30, edgecolor='k', alpha=0.7) plt.contour(Xgrid, Ygrid, Z.reshape(Xgrid.shape), levels=10, colors='black', linewidths=0.5, alpha=0.5) plt.title('月牙数据的密度热图与等高线') plt.legend() plt.show()

这种可视化特别适合:

  • 识别高密度区域
  • 发现潜在的异常点
  • 直观理解类别重叠程度

5. 高级标记:用形状和大小编码额外信息

通过自定义标记样式,可以在二维平面上展示更多维度的信息:

X, y = make_circles(n_samples=400, noise=0.1, factor=0.4) # 计算每个点到中心的距离作为大小依据 distances = np.sqrt(X[:,0]**2 + X[:,1]**2) sizes = 50 + 200 * (distances - distances.min()) / (distances.max() - distances.min()) markers = ['o', 's', 'D', '^', 'v'] # 圆形、方形、菱形、上三角、下三角 plt.figure(figsize=(10,6)) for class_value in [0,1]: for i, (x, y_val) in enumerate(zip(X[y==class_value,0], X[y==class_value,1])): # 根据索引选择不同标记 marker_idx = i % len(markers) plt.scatter(x, y_val, s=sizes[y==class_value][i], marker=markers[marker_idx], edgecolor='k', alpha=0.7, label=f'类别 {class_value}' if i==0 else "") plt.title('使用不同标记和大小编码额外信息') plt.xlabel('X坐标') plt.ylabel('Y坐标') plt.legend() plt.grid(True, alpha=0.3) plt.show()

这种编码方式可以同时展示:

  • 类别信息(颜色)
  • 相对位置(标记大小)
  • 数据点序号或分组(标记形状)

在实际项目中,我经常组合使用这些技巧。比如先用3D视图快速了解数据结构,然后用热图分析密度分布,最后用交互式图表与团队成员分享发现。记住,好的可视化不在于花哨的效果,而在于能否清晰传达数据背后的故事。

http://www.jsqmd.com/news/657609/

相关文章:

  • AI赋能研发革命:从辅助工具到核心引擎,揭秘研发智能大模型如何重塑未来!
  • 从PNG到预测结果:nnUNetv2二维图像分割保姆级教程(含数据集json生成秘籍)
  • 跨境电商老板必看:如何选择适合自己的代购系统
  • 手把手教你用RT-Thread Sensor框架驱动INA260(附完整代码与避坑指南)
  • 无感定位筑基空间计算,镜像视界打造数字孪生视频孪生全场景方案
  • SLAM综述(一)- 从原理到框架:拆解同步定位与建图的核心脉络
  • 从模块整合到数据持久化:第九届蓝桥杯单片机省赛核心功能实现剖析
  • 痞子衡嵌入式:大话双核i.MXRT1180之XIP应用里实现可靠Flash IAP的方法
  • 终极指南:5步将Deebot扫地机器人接入Home Assistant实现智能家居控制
  • 《数据库系统概论》实战解析:从DAC到MAC,构建企业级数据安全防线
  • 从零开始:使用VT2710板卡实现RS485通信的完整流程(含代码示例)
  • 5分钟上手gprMax:FDTD电磁仿真与地质雷达模拟完整指南
  • 3步解锁Windows 10/11的HEIC缩略图预览功能:告别iPhone照片的空白图标
  • 国内订阅 Claude Pro:用 Apple 礼品卡走 iPhone 内购的实践记录
  • 【笔试真题】- 电信-2026.04.11
  • FastAdmin Shopro与uni-app分销商城的功能定制与二次开发详解
  • 基于模块化解析架构的B站多媒体资源批量下载方案
  • 手把手教你用Wireshark抓包分析CPRI/eCPRI协议:从光模块信号到IQ数据映射实战
  • C++20 线程管理新选择:从 std::thread 到 std::jthread 的实战迁移指南
  • 工控机与GPIO:工业控制系统的“神经末梢”与“大脑”协同
  • S32K3 MCAL实战:手把手教你改造LPUART中断,搞定BLE/WiFi模组不定长数据接收
  • Java开发者必看!转型AI,薪资翻倍,学习路线全解析!
  • cv_unet_image-colorization镜像标准化:符合OCI规范,支持Kubernetes集群化部署
  • 别再让net::ERR_INCOMPLETE_CHUNKED_ENCODING中断你的数据导出!Spring Boot + Nginx实战排查指南
  • 避坑指南:在Cadence里做拉扎维习题仿真时,DC、AC和Tran仿真电源设置千万别搞混
  • Oracle学工系统SQL注入实战:从WAF拦截到SRC漏洞挖掘
  • nli-distilroberta-base生产环境:中小企业低成本部署NLI服务的完整方案
  • 我转行AI大模型了!从推荐算法到AI大模型:30岁工程师的转行抉择与高薪机遇!
  • 【表面粗糙度】基于粒子群PSO算法优化-BP神经网络的表面粗糙度研究附Matlab代码
  • 北京伯爵官方售后网点2026年4月核验报告(实地模拟考察版) - 速递信息