在同一坐标轴绘制多组带回归线的分组散点图
散点图(带分组颜色、标签及分年份回归线)实现方案
Excel 实现步骤
1. 数据预处理
- 保留原数据结构(Location/Year/A/B),可新增辅助列
Label,公式为=A2&" "&B2(假设Location在A列,Year在B列),用于后续点的标注。 - 单独整理1990年和2020年的子集:
- 1990子集:筛选
Year=1990的所有A、B数据 - 2020子集:筛选
Year=2020的所有A、B数据
- 1990子集:筛选
2. 创建分组散点图
- 选中所有A、B列数据,点击「插入」>「散点图」>「仅带数据标记的散点图」。
- 右键图表>「选择数据」,逐个添加每个国家的系列:
- 点击「添加」,系列名称选择对应国家的Location单元格,X值选择该国家的两个A值单元格,Y值选择对应两个B值单元格。
- 重复操作完成所有国家的系列添加,此时每个国家的两个数据点会自动使用不同颜色(可手动调整颜色方案)。
3. 添加数据标签
- 选中任意系列,点击「图表元素」>「数据标签」>「更多选项」。
- 在「标签选项」中勾选「单元格中的值」,选择对应国家的
Label列单元格,取消勾选默认的Y值,完成该系列的标签添加。 - 重复操作给所有系列添加标签。
4. 添加分年份回归线
- 右键图表>「选择数据」>「添加」,创建1990年数据系列:
- 系列名称填「1990回归线」,X值选1990子集的A列,Y值选1990子集的B列,点击确定。
- 选中这个新系列,点击「图表元素」>「趋势线」>「线性」,右键趋势线>「设置趋势线格式」:
- 勾选「显示公式」和「显示R平方值」,然后将该系列的「数据标记」设为「无」(隐藏原始点)。
- 重复上述步骤,添加2020年的回归线系列,完成后两条回归线会显示在同一坐标轴上。
Python(Matplotlib+Seaborn)实现方案
如果Excel操作繁琐,可使用Python快速实现,代码示例如下:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 读取数据(可替换为你的数据源路径) data = pd.DataFrame({ 'Location': ['Afghanistan']*2 + ['Albania']*2 + ['Algeria']*2 + ['Angola']*2 + ['Antigua and Barbuda']*2 + ['Argentina']*2, 'Year': [1990,2020]*6, 'A': [48.3973,65.432,76.4334,79.6756,68.5167,75.9125,82.6756,83.1922,73.6497,80.7452,75.9699,81.3155], 'B': [1377.85863,620.40751,32.87494,8.27645,205.81979,77.69479,1101.50579,221.90649,58.0267,21.24795,87.81427,44.90008] }) plt.figure(figsize=(10,6)) # 绘制分组散点图,每个国家一组颜色,年份用标记区分 sns.scatterplot(data=data, x='A', y='B', hue='Location', style='Year', s=100) # 添加1990年回归线 sns.regplot(data=data[data['Year']==1990], x='A', y='B', scatter=False, color='darkred', label='1990 回归线') # 添加2020年回归线 sns.regplot(data=data[data['Year']==2020], x='A', y='B', scatter=False, color='darkblue', label='2020 回归线') # 添加数据标签 for idx, row in data.iterrows(): plt.text(row['A']+0.5, row['B'], f"{row['Location']} {row['Year']}", fontsize=8) plt.legend(bbox_to_anchor=(1.05,1), loc='upper left') plt.xlabel('A') plt.ylabel('B') plt.title('带分组颜色与分年份回归线的散点图') plt.tight_layout() plt.show()
内容的提问来源于stack exchange,提问作者Reptile Smile
相关产品推荐
相关产品推荐

