Python Matplotlib绘图:为DataFrame图表添加新坐标轴及自定义刻度
解决方案
嘿,这就帮你把图表改成你想要的样子!我把完整的可运行代码和每个改造点的细节解释都整理好了👇
完整代码
import pandas as pd import matplotlib.pyplot as plt # 初始化你的DataFrame df = pd.DataFrame( data=[ [20,69.262295,0.458615,244], [40,52.049180,0.105605,488], [60,37.380628,0.037798,733], [80,28.659161,0.018166,977], [100,23.013923,0.004136,1221] ], columns=['percentage','confidence','threshold','size'] ) # 创建主画布和主坐标轴 fig, ax1 = plt.subplots(figsize=(8, 5)) # 绘制主折线图:Percentage vs Confidence line1, = ax1.plot(df['percentage'], df['confidence'], color='#1f77b4', marker='o', label='Confidence') # 改造1:替换主坐标轴刻度为DataFrame中的值 ax1.set_xticks(df['percentage']) # X轴刻度用DataFrame的percentage列 ax1.set_yticks(df['confidence']) # Y轴(Confidence)刻度用DataFrame的confidence列 ax1.set_xlabel('Percent of Population', fontsize=10) ax1.set_ylabel('Confidence', fontsize=10, color='#1f77b4') ax1.tick_params(axis='y', labelcolor='#1f77b4') # 改造2:添加左侧Y轴对应Threshold值 ax2 = ax1.twinx() # 创建共享X轴的双Y轴 line2, = ax2.plot(df['percentage'], df['threshold'], color='#ff7f0e', marker='s', label='Threshold') ax2.set_yticks(df['threshold']) # 左侧Y轴刻度用DataFrame的threshold列 ax2.set_ylabel('Threshold', fontsize=10, color='#ff7f0e') ax2.tick_params(axis='y', labelcolor='#ff7f0e') # 改造3:添加顶部X轴对应Size值 ax3 = ax1.twiny() # 创建共享Y轴的双X轴 ax3.set_xticks(df['percentage']) # 顶部X轴刻度位置和主X轴对齐 ax3.set_xticklabels(df['size']) # 刻度文本替换为DataFrame的size列 ax3.set_xlabel('Size', fontsize=10) # 合并图例,提升可读性 fig.legend([line1, line2], ['Confidence', 'Threshold'], loc='upper right', bbox_to_anchor=(1.2, 1)) # 调整布局,避免标签被截断 plt.tight_layout() plt.show()
关键改造点说明
- 替换坐标轴刻度:通过
set_xticks()和set_yticks()直接指定DataFrame中的列值,彻底替换Matplotlib自动生成的刻度,确保完全匹配你的数据。 - 左侧新增Threshold Y轴:用
twinx()创建和主X轴共享的双Y轴,这样每个Percentage对应的Threshold值会精准对齐;用不同颜色区分两个Y轴,避免视觉混淆。 - 顶部新增Size X轴:用
twiny()创建和主Y轴共享的双X轴,先让顶部X轴的刻度位置和主X轴完全一致,再把显示的文本替换成对应的Size值,完美实现Percentage和Size的一一映射。 - 额外优化:添加了标记点(圆形/方形)、颜色区分和图例,让图表更直观;最后用
tight_layout()自动调整布局,防止标签被画布截断。
内容的提问来源于stack exchange,提问作者gabboshow
相关产品推荐
相关产品推荐

