散点图scatter()气泡边缘颜色随大小控制失效问题排查
散点图气泡边缘颜色逻辑异常问题
问题说明
制作散点图时,计划根据气泡大小设置边缘颜色:
- 气泡大小超过700000时,边缘设为黑色
- 气泡大小≤700000时,用RGBA元组
(0,0,0,0)设置透明边缘
但实际效果是:所有气泡都显示边缘,即便bubble_size_filtered的值远小于700000。将阈值改为7000000(无气泡超过该值)时,所有气泡边缘都消失,说明(0,0,0,0)的透明设置有效,问题出在筛选逻辑的代码实现上。
已确认bubble_size_filtered为pandas.core.series.Series类型,部分输出如下:
0 120.0 1 2000.0 2 5000.0 3 3000.0 4 360.0 ... 2042 21.0 2044 15.0 2045 85.0 2046 100.0 2047 36.0
相关错误代码片段:
outliner_colors = [] for size in bubble_size_filtered: if size > 700000: outliner_colors.append("black") else: outliner_colors.append((0, 0, 0, 0)) ax.scatter(xvar_filtered, yvar_filtered, s=scaled_dot_size, c=dot_colors, edgecolors=outliner_colors, alpha=0.5-large_ghosting_scale)
问题根源
代码中**ax.scatter()被错误地放在了for循环内部**,导致每遍历一个气泡大小,就重新绘制整个数据集的散点图:
- 每次循环时
outliner_colors长度逐步增加,matplotlib会循环使用现有颜色值填充,导致边缘颜色不符合预期 - 多次绘制的散点叠加,原本应该透明的边缘被重复绘制的气泡覆盖,最终显示出边缘
解决方案
1. 修正缩进,移出绘制代码
将ax.scatter()移出for循环,确保仅在outliner_colors构建完成后调用一次:
outliner_colors = [] for size in bubble_size_filtered: if size > 700000: outliner_colors.append("black") else: outliner_colors.append((0, 0, 0, 0)) # 将scatter移到循环外部,确保使用完整的颜色列表 ax.scatter(xvar_filtered, yvar_filtered, s=scaled_dot_size, c=dot_colors, edgecolors=outliner_colors, alpha=0.5-large_ghosting_scale)
2. 简化颜色列表生成(可选)
用pandas的apply方法替代循环,更高效且避免缩进错误:
# 直接生成颜色列表,无需手动循环 outliner_colors = bubble_size_filtered.apply(lambda size: "black" if size > 700000 else (0, 0, 0, 0)).tolist() ax.scatter(xvar_filtered, yvar_filtered, s=scaled_dot_size, c=dot_colors, edgecolors=outliner_colors, alpha=0.5-large_ghosting_scale)
内容的提问来源于stack exchange,提问作者k_1223
相关产品推荐
相关产品推荐

