如何基于Q1/Q2/Q3、最值等信息手动绘制差分隐私箱线图
手动绘制基于统计量的差分隐私箱线图
核心思路
你猜的没错,确实需要借助matplotlib的基础绘图函数手动构建箱线图的各个组件——完全基于你提供的统计量(Q1、Q2、Q3、最小值、最大值、均值)实现,不需要任何原始数据。
具体实现步骤与代码
1. 导入依赖库
import matplotlib.pyplot as plt from matplotlib.patches import Rectangle
2. 定义统计量(替换为你的实际数据)
# 差分隐私统计量示例,替换成你的真实值 q1 = 20 q2 = 30 # 中位数 q3 = 40 min_val = 10 max_val = 60 mean_val = 32 # 计算IQR和须线上下限 iqr = q3 - q1 whisker_low = q1 - 1.5 * iqr whisker_high = q3 + 1.5 * iqr
3. 手动绘制箱线图组件
# 创建画布与坐标轴 fig, ax = plt.subplots(figsize=(6, 8)) # 设定箱线图在x轴的位置(单个图设为1,多个图可设为1、2、3...) x_pos = 1 # 箱体宽度 box_width = 0.4 # 绘制箱体(Q1到Q3的矩形区域) box = Rectangle((x_pos - box_width/2, q1), box_width, iqr, facecolor='lightblue', edgecolor='black') ax.add_patch(box) # 绘制中位数线(横穿箱体的粗线) ax.plot([x_pos - box_width/2, x_pos + box_width/2], [q2, q2], color='black', linewidth=2) # 绘制下须线与盖帽 ax.plot([x_pos, x_pos], [q1, whisker_low], color='black') ax.plot([x_pos - box_width/3, x_pos + box_width/3], [whisker_low, whisker_low], color='black') # 绘制上须线与盖帽 ax.plot([x_pos, x_pos], [q3, whisker_high], color='black') ax.plot([x_pos - box_width/3, x_pos + box_width/3], [whisker_high, whisker_high], color='black') # 绘制真实最小值、最大值(红色圆点标记) ax.scatter(x_pos, min_val, color='red', marker='o', s=80, zorder=5) ax.scatter(x_pos, max_val, color='red', marker='o', s=80, zorder=5) # 绘制均值(绿色菱形标记,区分中位数) ax.scatter(x_pos, mean_val, color='green', marker='D', s=80, zorder=5) # 调整坐标轴样式 ax.set_xticks([x_pos]) ax.set_xticklabels(['差分隐私分布']) ax.set_ylabel('数值') ax.set_title('基于统计量的箱线图') ax.grid(axis='y', linestyle='--', alpha=0.7) plt.show()
关键细节说明
- 箱体用
Rectangle绘制,参数对应左下角坐标、宽度、高度(高度即IQR) - 中位数线用加粗横线突出,和箱体形成视觉区分
- 须线盖帽宽度设为箱体的1/3,保证视觉协调
- 真实最小/最大值用红色圆点置于最上层(
zorder=5),避免被其他元素遮挡 - 均值用绿色菱形标记,和中位数做明确区分
- 若要绘制多个箱线图,只需将
x_pos设为不同数值(如1、2、3),重复上述绘图步骤即可
内容的提问来源于stack exchange,提问作者Bex T.
相关产品推荐
相关产品推荐

