二次元世界的“未过审”:禁忌之美与窥探欲的交织

核心内容摘要

91大事件:风云变幻,铭刻时代的传奇
探寻“嫩BBB槡BBBB槡BBBB撒尿”背后的奇趣世界

久久精品网

想象一下夏日的花丛中成群的蜜蜂围绕着花朵忙碌地飞舞。

每只蜜蜂都是一个独立的数据点它们既保持群体聚集的形态又不会完全重叠在一起。

这就是蜂群图Swarm Plot的核心理念——在有限的空间内展示所有数据点让每个点都能被清晰看见。

蜂群图是一种特殊的数据可视化图表它将分类数据与数值数据结合起来展示数据的分布情况。

与传统的条形图或箱线图不同蜂群图不进行任何数据聚合而是展示每一个原始数据点避免了信息丢失。

蜂群图核心特点蜂群图最巧妙的地方在于它的布局算法。

当多个数据点具有相似数值时它们不会简单地重叠在一起而是像有“排斥力”一样在垂直方向或水平方向上轻微偏移形成一个类似蜂群的分布。

比如下面是同一组数据在散点图和蜂群图中展示的效果。

从中可以看出蜂群图的核心特点有绝不重叠 它通过算法检测数据点的重叠情况一旦发现两个点数值相近就会自动把它们向水平方向推开。

保留分布形态 散开后的形状天然形成了一种类似“小提琴”或“山峰”的轮廓直观地展示了数据的密度。

参数调整 我们可以调整点的大小marker size和排列的紧密程度。

点越大视觉冲击力越强但需要的水平空间也越多。

蜂群图 vs. 条形图从摘要到细节条形图就像是一份数据摘要报告它告诉我们每个类别的平均值或总计值但隐藏了数据内部的分布细节。

而蜂群图则像是一次数据点的全员大会每个数据点都有发言的机会。

下面针对同一组数据我们分别绘制了条形图、箱线图和蜂群图一起来感受一下它们之间不同的展示效果。

/* by yours.tools - online tools website : yours.tools/zh/hexconvert.html */ # 生成示例数据 np.random.seed(

categories [产品A, 产品B, 产品C, 产品D] data_comparison [] for category in categories: n_points 40 if category 产品A: values np.random.normal(75, 8, n_points) elif category 产品B: values np.random.normal(82, 12, n_points) elif category 产品C: values np.random.normal(65, 5, n_points) else: # 产品D # 创建一个双峰分布 values1 np.random.normal(55, 6, n_points //

values2 np.random.normal(85, 7, n_points //

values np.concatenate([values1, values2]) for value in values: data_comparison.append({产品: category, 用户评分: value}) #

条形图平均值 means [] for category in categories: cat_data [d[用户评分] for d in data_comparison if d[产品] category] means.append(np.mean(cat_data)) bars axes[0].bar( categories, means, color[#1f77b4, #ff7f0e, #2ca02c, #d62728] ) # 在条形上标注平均值 # 省略... #

箱线图 box_data [] for category in categories: cat_data [d[用户评分] for d in data_comparison if d[产品] category] box_data.append(cat_data) boxplot axes[1].boxplot( box_data, tick_labelscategories, patch_artistTrue, boxpropsdict(facecolorlightblue) ) # 省略... #

蜂群图 data_df pd.DataFrame(data_comparison) sns.swarmplot( x产品, y用户评分, hue产品, datadata_df, axaxes[2], size5, paletteSet2, edgecolorblack, linewidth

5, ) # 省略... plt.tight_layout() plt.show()绘制蜂群图可以用seaborn这个库中的swarmplot函数。

从上面的对比可以看出条形图告诉我们产品D的平均分约为70分箱线图提示产品D的数据分布范围很广但只有蜂群图清晰地揭示了产品D实际上有两个明显的用户群体一个低评分群体和一个高评分群体

蜂群图 vs. 散点图从混乱到有序传统散点图在处理分类数据时常常导致数据点大量重叠形成黑团我们无法看清数据点的真实分布。

蜂群图通过智能布局算法解决了这个问题。

下面构造一个不同密度的数据看看蜂群图和散点图的展示效果。

/* by yours.tools - online tools website : yours.tools/zh/hexconvert.html */ # 比较散点图与蜂群图的视觉效果 fig, axes plt.subplots(1, 2, figsize(14,

) # 生成具有不同密度的数据 np.random.seed(

density_data [] categories [低密度, 中等密度, 高密度] for i, category in enumerate(categories): n_points 20 i * 30 # 不同密度 if category 低密度: values np.random.normal(50, 15, n_points) elif category 中等密度: values np.random.normal(50, 8, n_points) else: # 高密度 values np.random.normal(50, 4, n_points) for value in values: density_data.append({类别: category, 数值: value}) # 左侧传统散点图 for i, category in enumerate(categories): cat_data [d[数值] for d in density_data if d[类别] category] x_positions np.full(len(cat_data), i) axes[0].scatter(x_positions, cat_data, alpha

6, s60, labelcategory) #省略... # 右侧蜂群图 density_data_df pd.DataFrame(density_data) sns.swarmplot( x类别, y数值, hue类别, datadensity_data_df, axaxes[1], size6, palettecoolwarm, edgecolorblack, linewidth

5, ) #省略... plt.tight_layout() plt.show()蜂群图解决了“重叠Overplotting”的问题。

在数据量适中几百到几千个点时它是展示分布密度的最佳选择。

蜂群图的适用场景蜂群图并不是为了取代条形图或散点图它有自己的适用场景和局限性。

适合使用蜂群图的场景样本量适中通常少于几百个点时展示完整数据分布需要同时看到整体趋势和个体数据点数据有多个分类变量需要比较不同类别分布希望发现异常值或特殊模式如双峰分布蜂群图的局限性主要有大数据集可能导致图表过于拥挤对于非常大规模数据箱线图或小提琴图可能更合适精确的数值比较不如条形图直观

5.

总结蜂群图就像数据可视化领域的显微镜它让我们既能观察到数据的整体分布形态又能看到每一个数据点的具体位置。

与只能显示摘要信息的条形图和容易产生重叠的散点图相比蜂群图在显示中小型数据集的完整分布信息方面具有独特优势。

在数据可视化实践中选择正确的图表类型就像选择正确的工具一样重要。

当下一次你需要展示分类数据的分布时不妨尝试一下蜂群图它可能会揭示出你从未注意到的数据秘密。

文中的完整代码共享在蜂群图.ipynb (访问密码:

6872)

自动恢复蓝莓视频-自动恢复蓝莓视频应用

百度百家号客服电话人工服务

123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123