You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于已知分割线绘制多背景色的Seaborn散点图?

实现带多色背景的Seaborn散点图

核心思路是先利用Matplotlib绘制不同颜色的背景矩形区域,再在上方叠加Seaborn散点图。具体实现步骤如下:

1. 导入依赖库

先把需要的库导入:

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle

2. 编写背景绘制函数

写一个可复用的函数,用来根据分割点生成对应颜色的背景区域:

def plot_background_axes(ax, split_points, colors):
    # 获取x轴的范围,确保背景覆盖整个图表宽度
    x_min, x_max = ax.get_xlim()
    # 获取y轴范围,让背景覆盖整个高度
    y_min, y_max = ax.get_ylim()
    
    # 处理分割点,把x轴最小值加入开头,形成完整区间
    full_points = [x_min] + split_points + [x_max]
    
    # 循环绘制每个颜色的背景矩形
    for i in range(len(full_points)-1):
        # 创建矩形:x起始位置、y起始位置、宽度、高度
        rect = Rectangle((full_points[i], y_min), 
                         full_points[i+1]-full_points[i], 
                         y_max-y_min, 
                         color=colors[i], 
                         alpha=0.2)  # alpha控制透明度,避免遮挡散点
        ax.add_patch(rect)

3. 完整示例代码

结合模拟数据,完整实现整个流程:

# 模拟测试数据
df = pd.DataFrame({
    'x': range(0, 101),
    'y': [i**0.5 + pd.np.random.randn()*2 for i in range(0, 101)]
})

split_points = [20,40,60,80,100]
# 定义对应区间的背景色,数量要和分割点+1的区间数一致
bg_colors = ['#ffcccc', '#ccffcc', '#ccccff', '#ffccff', '#ccffff', '#ffffcc']

# 创建画布和坐标轴
fig, ax = plt.subplots(figsize=(10,6))

# 先绘制散点(这样能先获取正确的轴范围)
sns.scatterplot(data=df, x='x', y='y', ax=ax, zorder=2)  # zorder确保散点在背景上方

# 绘制背景色
plot_background_axes(ax, split_points, bg_colors)

# 调整x轴刻度,显示分割点
ax.set_xticks(split_points)
plt.title('带多色背景的散点图')
plt.show()

关键说明

  • 注意zorder参数:设置散点的zorder大于背景矩形(默认背景是1,散点设为2即可),确保散点不会被背景遮挡。
  • 颜色和分割点的匹配:bg_colors的长度需要等于split_points的长度+1,因为n个分割点会把x轴分成n+1个区间。
  • 透明度调整:通过alpha参数控制背景色的透明度,避免背景过于突兀影响散点的可读性。
  • 动态轴范围:函数里通过ax.get_xlim()和ax.get_ylim()获取当前轴的范围,即使数据范围变化也能自适应。

内容的提问来源于stack exchange,提问作者NSK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 01:27:20