如何为聚类散点图设置左右双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




