You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何为聚类散点图设置左右双X轴并共享Y轴?

实现共享Y轴的左右双X轴散点图

我明白你想要的效果:同一个绘图区域里,左侧和右侧各有一个独立的X轴,两个散点图共享中间的Y轴,而不是现在代码里的两个并排子图。你当前的subplots(ncols=2)方式是把图分成了左右两个独立区域,这和你的需求不符,咱们换个思路来实现:

问题拆解

你需要的是「双X轴(左右分布)+ 共享Y轴」的单坐标系布局,而不是拆分多个子图。Matplotlib里可以通过主坐标轴+次级X轴的方式来实现这个需求。

修正后的代码

import matplotlib.pyplot as plt
import pandas as pd

# 读取数据
filename1 = "ex_1.csv"
df1 = pd.read_csv(filename1)
filename2 = "ex_21.csv"
df2 = pd.read_csv(filename2)

x1 = df1['Dom']
y1 = df1['Sal']
s1 = df1['Size']
x2 = df2['Type']
y2 = df2['Sal']
s2 = df2['Size']

# 创建主画布和主坐标轴(左侧X轴 + 共享Y轴)
fig, ax1 = plt.subplots(figsize=(10, 6))

# 绘制第一个散点图(绑定左侧X轴)
scatter_left = ax1.scatter(x=x1, y=y1, s=s1*50, alpha=0.8, c="blue", label="Dom 聚类")
ax1.set_xlabel('Dom', fontsize=12, color='blue')
ax1.set_ylabel('Sal', fontsize=12)
ax1.tick_params(axis='x', labelsize=10, labelcolor='blue')

# 创建右侧的次级X轴,和主坐标轴共享Y轴
ax2 = ax1.secondary_xaxis('right')

# 处理第二个散点图的X轴(右侧)
# 如果x2是分类变量(比如字符串类型),需要转成数值索引适配坐标轴
if x2.dtype == 'object':
    # 给分类值分配索引
    cat_mapping = {cat: idx for idx, cat in enumerate(x2.unique())}
    x2_num = x2.map(cat_mapping)
    # 设置右侧X轴的刻度和标签
    ax2.set_xticks(list(cat_mapping.values()))
    ax2.set_xticklabels(list(cat_mapping.keys()))
else:
    # 如果是数值变量,直接用原数据
    x2_num = x2

# 绘制第二个散点图(绑定右侧X轴)
scatter_right = ax2.scatter(x=x2_num, y=y2, s=s2*50, alpha=0.8, c="red", label="Type 聚类")
ax2.set_xlabel('Type', fontsize=12, color='red')
ax2.tick_params(axis='x', labelsize=10, labelcolor='red')

# 添加图例,让两个散点图的标识更清晰
fig.legend(handles=[scatter_left, scatter_right], loc="upper right", bbox_to_anchor=(1.15, 1))

# 自动调整布局,避免标签被截断
plt.tight_layout()
plt.show()

关键说明

  • 主坐标轴ax1:负责左侧X轴和共享Y轴的渲染,第一个散点图基于此轴绘制。
  • 次级X轴ax2:通过ax1.secondary_xaxis('right')创建,它会复用ax1的Y轴,同时在右侧生成独立的X轴。
  • 分类变量适配:如果你的Type列是分类类型(比如字符串),代码里的映射逻辑会把分类值转成坐标轴能识别的数值,同时保留原分类名称作为刻度标签,保证右侧X轴显示正常。
  • 视觉区分:给左右X轴设置不同的颜色,方便快速区分两个聚类数据对应的坐标轴。

这样调整后,就能得到你想要的「共享Y轴、左右各一个X轴」的散点图,两个聚类数据会叠加在同一个坐标系里,更便于对比分析。

内容的提问来源于stack exchange,提问作者Anis R. Amna

火山引擎 最新活动