别再只用散点图了!用make_circles和make_moons生成的数据,教你玩转5种可视化技巧(附完整代码)
别再只用散点图了用make_circles和make_moons生成的数据教你玩转5种可视化技巧附完整代码当我们用make_circles和make_moons生成数据时大多数人止步于基础的散点图展示。但数据可视化的魅力远不止于此——通过调整参数和组合不同图表技术这些简单的二维数据集可以变成探索数据特性的强大工具。下面我将分享5个能立即提升你分析深度的可视化技巧每个都附带可直接运行的代码。1. 3D投影揭示隐藏的维度结构虽然原始数据是二维的但通过添加第三个维度比如到原点的距离或类别概率我们可以发现新的模式。使用mpl_toolkits.mplot3d可以轻松实现from mpl_toolkits.mplot3d import Axes3D X, y make_moons(n_samples400, noise0.1) z np.sqrt(X[:,0]**2 X[:,1]**2) # 计算到原点的距离 fig plt.figure(figsize(10,6)) ax fig.add_subplot(111, projection3d) scatter ax.scatter(X[:,0], X[:,1], z, cy, cmapviridis, s50, edgecolork) ax.set_xlabel(X坐标) ax.set_ylabel(Y坐标) ax.set_zlabel(到原点距离) plt.title(3D投影的月牙数据, pad20) plt.show()这种可视化特别适合展示类别间的分离程度观察不同类别在第三维度的分布差异噪声影响通过调整noise参数直观看到数据点在高维空间的分散情况提示尝试将z值改为np.exp(-(X[:,0]**2 X[:,1]**2))可以得到高斯核转换后的效果2. 动态交互用Plotly实现可探索的可视化静态图表有其局限而交互式可视化允许我们缩放查看密集区域悬停查看数据点详情动态切换不同视角import plotly.express as px X, y make_circles(n_samples400, noise0.1, factor0.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, xx, yy, zradius, colorlabel, sizeradius, hover_data[x, y], color_continuous_scalepx.colors.sequential.Viridis, title交互式环形数据探索) fig.update_layout(scene_zaxis_typelog) 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), sharexTrue, shareyTrue) for i, noise in enumerate(noise_levels): for j, factor in enumerate(factors): X, y make_circles(n_samples200, noisenoise, factorfactor) axes[i,j].scatter(X[:,0], X[:,1], cy, cmapcoolwarm, s30, alpha0.7) axes[i,j].set_title(f噪声:{noise}, 比例:{factor}, fontsize9) plt.tight_layout() plt.suptitle(不同噪声和比例因子下的数据分布比较, y1.02) plt.show()这个可视化帮助我们理解噪声(noise)值越大类别边界越模糊比例因子(factor)控制内外圆半径比影响类别间距离4. 密度热图展示数据分布的统计特性当数据点非常密集时散点图会变得难以解读。热图与等高线的组合能更好地展示分布密度from scipy.stats import gaussian_kde X, y make_moons(n_samples1000, noise0.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), levels20, cmapPurples) plt.colorbar(label点密度) # 叠加原始数据点 for class_value in [0,1]: mask y class_value plt.scatter(X[mask,0], X[mask,1], labelf类别 {class_value}, s30, edgecolork, alpha0.7) plt.contour(Xgrid, Ygrid, Z.reshape(Xgrid.shape), levels10, colorsblack, linewidths0.5, alpha0.5) plt.title(月牙数据的密度热图与等高线) plt.legend() plt.show()这种可视化特别适合识别高密度区域发现潜在的异常点直观理解类别重叠程度5. 高级标记用形状和大小编码额外信息通过自定义标记样式可以在二维平面上展示更多维度的信息X, y make_circles(n_samples400, noise0.1, factor0.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[yclass_value,0], X[yclass_value,1])): # 根据索引选择不同标记 marker_idx i % len(markers) plt.scatter(x, y_val, ssizes[yclass_value][i], markermarkers[marker_idx], edgecolork, alpha0.7, labelf类别 {class_value} if i0 else ) plt.title(使用不同标记和大小编码额外信息) plt.xlabel(X坐标) plt.ylabel(Y坐标) plt.legend() plt.grid(True, alpha0.3) plt.show()这种编码方式可以同时展示类别信息颜色相对位置标记大小数据点序号或分组标记形状在实际项目中我经常组合使用这些技巧。比如先用3D视图快速了解数据结构然后用热图分析密度分布最后用交互式图表与团队成员分享发现。记住好的可视化不在于花哨的效果而在于能否清晰传达数据背后的故事。