同一数据集两组back to back stem and leaf plot绘制:母乳喂养组与对照组骨水平对比
背对背(对比式)茎叶图实现方案
以下方案覆盖通用数据集对比场景和指定的母乳喂养群体骨水平对比场景:
通用场景实现方案
针对同一数据集内两组对象的对比需求,可通过以下两种常用统计工具实现:
- Python实现
可基于matplotlib自定义样式实现灵活的可视化调整,示例代码如下:
import matplotlib.pyplot as plt import numpy as np def back_to_back_stem(group1, group2, stem_unit=10): # 数据预处理:拆分茎和叶 def split_stem_leaf(data, unit): stems = np.floor(data / unit).astype(int) leaves = (data % unit).astype(int) return stems, leaves s1, l1 = split_stem_leaf(group1, stem_unit) s2, l2 = split_stem_leaf(group2, stem_unit) all_stems = np.union1d(s1, s2) # 绘制左侧组 for s in all_stems: leaves_left = l1[s1==s] plt.scatter([-len(leaves_left)+i for i in range(len(leaves_left))], [s]*len(leaves_left), marker='o', c='#1f77b4') for i, val in enumerate(leaves_left): plt.text(-len(leaves_left)+i, s, str(val), ha='center', va='center', c='white') # 绘制右侧组 for s in all_stems: leaves_right = l2[s2==s] plt.scatter([i+1 for i in range(len(leaves_right))], [s]*len(leaves_right), marker='o', c='#ff7f0e') for i, val in enumerate(leaves_right): plt.text(i+1, s, str(val), ha='center', va='center', c='white') # 基础样式调整 plt.axvline(0, c='black') plt.yticks(all_stems, all_stems) plt.tick_params(axis='x', which='both', bottom=False, labelbottom=False) plt.xlabel("左侧为第一组 | 右侧为第二组") plt.ylabel("茎") plt.show() # 调用示例:传入两组数值数据,指定茎的单位即可 group_a = np.random.randint(10,99,50) group_b = np.random.randint(10,99,50) back_to_back_stem(group_a, group_b, stem_unit=10)
- R实现
直接调用aplpack包的stem.leaf.backback函数即可快速生成文本格式的背对背茎叶图,示例代码如下:
# 安装并加载依赖 install.packages("aplpack") library(aplpack) # 传入两组数据直接生成 group1 <- c(12,15,21,23,27,32,35,38,41,45) group2 <- c(14,17,22,25,29,31,36,39,43,47) stem.leaf.backback(group1, group2, m=1)
母乳喂养群体与对照组骨水平对比场景实现方案
该场景下可直接复用上述通用方案,按业务规则调整参数即可:
- 数据规则:骨水平通常保留1位小数,因此设置茎单位为1,茎层为骨水平的整数部分,叶为小数部分
- 布局规则:左侧放置母乳喂养组数据,右侧放置对照组数据,与参考样式匹配
- 调用示例(Python版):
# 模拟业务数据:母乳喂养组、对照组骨水平数值(范围0.5~2.5) breastfeed_group = np.round(np.random.uniform(0.5,2.5,30),1) control_group = np.round(np.random.uniform(0.8,2.7,30),1) # 转换为整数处理:放大10倍避免浮点误差,茎单位设为10对应原数值整数位 back_to_back_stem(breastfeed_group*10, control_group*10, stem_unit=10)
如果需要调整标签匹配业务语义,只需修改函数内的plt.xlabel参数为plt.xlabel("母乳喂养组 | 对照组"),plt.ylabel参数为plt.ylabel("骨水平(整数位)")即可。
内容的提问来源于stack exchange,提问作者Hanna Huston
相关产品推荐
相关产品推荐

