Matplotlib/Seaborn中如何将次级X轴与主X轴按比例对齐?
解决Matplotlib/Seaborn双X轴按比例对齐的问题
我明白你现在卡在哪了:主X轴是运行时间(秒),顶部的次级X轴是数据量(就是你定义的numeri列表),想要让这两个轴严格按数值比例对齐——也就是每个数据量对应的刻度,刚好落在该数据量对应的运行时间在主X轴的位置上。
你的原代码里直接给次级轴设置了ticks为numeri,但没把这些刻度和主X轴的实际时间值关联起来,所以才会出现不对齐的情况。下面是调整后的完整代码,我会把关键点给你讲清楚:
修改后的代码
import matplotlib.pyplot as plt import seaborn as sns import pandas as pd numeri = [1000, 10000, 100000, 1000000, 5000000,10000000, 50000000, 100000000, 250000000] num_cores = [2,3,4,5,6] # 假设你定义了这个变量,原代码中用到了该变量 def plot_time(): plt.switch_backend('TkAgg') sns.set_context('talk') plt.title('CPU Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz') data_df = pd.melt(df_cores_shuffle, 'Num Cores') # 绘制主图 ax = sns.lineplot(data=data_df, x='value', y='Num Cores', hue='Num Cores', palette=["#1f77b4", "#00FF00", "#00FFFF", "#00BFFF", "#8A2BE2"]) ax.set(xlabel='Time (Seconds)', ylabel='# Cores') ax.set(yticks=num_cores) # 创建次级X轴并实现刻度对齐 ax2 = ax.twiny() # 提取每个数据量对应的主X轴时间值(这里取Num Cores=2的时间序列,和numeri一一对应) time_mapping = data_df[data_df['Num Cores'] == 2]['value'].tolist() # 设置次级轴的刻度位置为主X轴的对应时间值,刻度标签替换为数据量 ax2.set_xticks(time_mapping) ax2.set_xticklabels(numeri) # 给次级轴添加标签,让图表更清晰 ax2.set_xlabel('Data Size') plt.show()
核心调整说明
- 建立刻度映射关系:从
data_df中提取每个numeri对应的主X轴时间值(这里选了Num Cores=2的时间数据,因为每个数据量都有对应的记录;你也可以选其他核心数的,或者取同一数据量下的平均时间,结果差异很小)。 - 绑定次级轴刻度位置:用
set_xticks()把次级轴的刻度位置设置为刚才提取的时间值,再用set_xticklabels()把这些位置的标签换成对应的numeri数值,这样两个轴的刻度就会严格按比例对齐了。 - 完善图表信息:给次级轴加上
Data Size的标签,让读者一眼就能看懂两个X轴的含义。
这样调整后,顶部的次级X轴每个数据量刻度,都会精准对应到该数据量在主X轴上的运行时间位置,完全符合你想要的比例约束对齐效果。
内容的提问来源于stack exchange,提问作者Salvatore Danilo Palumbo
相关产品推荐
相关产品推荐

