You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何确保Matplotlib误差棒图Y轴分类变量的指定顺序

解决Matplotlib误差棒图Y轴分类顺序问题

问题背景

尝试用Matplotlib绘制误差棒图时,需要Y轴分类变量按指定顺序(Most Similar → Moderately Similar → Distinct → Most Distinct)排列,尽管已经将DataFrame的Variable列设为有序分类并排序,绘图结果仍未呈现预期顺序。原代码如下:

import pandas as pd
import matplotlib.pyplot as plt

# Data for ITT
itt_data = {
'Variable': ['Most Similar', 'Moderately Similar', 'Distinct', 'Most Distinct'],
'Coef.': [0.2572047, 0.1326441, 0.4539544, -0.7915292],
'Std. Err.': [0.3592403, 0.3272935, 0.3179865, 0.3443217],
'0.025': [-0.4471788, -0.5090995, -0.1695404, -1.466661],
'0.975': [0.9615881, 0.7743876, 1.077449, -0.1163975]
}
itt_df = pd.DataFrame(itt_data)

# Set the order of the 'Variable' column
order = ['Most Similar', 'Moderately Similar', 'Distinct', 'Most Distinct']
itt_df['Variable'] = pd.Categorical(itt_df['Variable'], categories=order, ordered=True)
itt_df = itt_df.sort_values('Variable')

# Plotting function for ITT
def plot_itt_coefficients(data, title, color, filename):
    fig, ax = plt.subplots(figsize=(4, 8))  # Different size for ITT plot

    # Reorder the data according to the specified order
    data = data.set_index('Variable').reindex(order)
    
    # Ensure the variables are plotted in the correct order
    variables = data.index.tolist()
    coefficients = data['Coef.'].tolist()
    errors_low = (data['Coef.'] - data['0.025']).tolist()
    errors_high = (data['0.975'] - data['Coef.']).tolist()
    errors = [errors_low, errors_high]
    
    ax.errorbar(coefficients, range(len(variables)), xerr=errors, fmt='o', capsize=3, elinewidth=1.5, color=color)
    ax.axvline(x=0, color='black', linestyle='--')
    ax.set_xlim(-3, 3)
    ax.set_yticks(range(len(variables)))
    ax.set_yticklabels(variables)
    ax.set_xlabel('Point Estimate')
    ax.set_ylabel('')
    ax.set_title(title)
    
    plt.tight_layout()
    plt.savefig(filename)  # Save the figure
    plt.show()

# Colors from the screenshot
colors = ['#b5d1ae', '#80ae9a', '#568b87', '#326b77', '#1b485e', '#122740']

# Plot ITT Results
plot_itt_coefficients(itt_df, 'ITT', colors[0], 'ITT_Results.png')

问题原因

Matplotlib中,range(len(variables))生成的Y轴坐标是从0到3,对应绘图区域的从下到上排列。而我们预期的分类顺序是从上到下显示Most Similar到Most Distinct,两者方向相反,导致最终显示顺序颠倒。

修复方案

只需调整Y轴坐标的生成顺序,或者直接反转Y轴即可,以下提供两种可行方式:

  • 方式1:反转Y轴坐标序列,将range(len(variables))替换为range(len(variables)-1, -1, -1),让第一个分类变量对应最上方的坐标
  • 方式2:调用ax.invert_yaxis(),在设置完Y轴刻度后反转Y轴方向

修复后的完整代码(以方式2为例)

import pandas as pd
import matplotlib.pyplot as plt

# Data for ITT
itt_data = {
'Variable': ['Most Similar', 'Moderately Similar', 'Distinct', 'Most Distinct'],
'Coef.': [0.2572047, 0.1326441, 0.4539544, -0.7915292],
'Std. Err.': [0.3592403, 0.3272935, 0.3179865, 0.3443217],
'0.025': [-0.4471788, -0.5090995, -0.1695404, -1.466661],
'0.975': [0.9615881, 0.7743876, 1.077449, -0.1163975]
}
itt_df = pd.DataFrame(itt_data)

# Set the order of the 'Variable' column
order = ['Most Similar', 'Moderately Similar', 'Distinct', 'Most Distinct']
itt_df['Variable'] = pd.Categorical(itt_df['Variable'], categories=order, ordered=True)
itt_df = itt_df.sort_values('Variable')

# Plotting function for ITT
def plot_itt_coefficients(data, title, color, filename):
    fig, ax = plt.subplots(figsize=(4, 8))  # Different size for ITT plot

    # Reorder the data according to the specified order
    data = data.set_index('Variable').reindex(order)
    
    # Ensure the variables are plotted in the correct order
    variables = data.index.tolist()
    coefficients = data['Coef.'].tolist()
    errors_low = (data['Coef.'] - data['0.025']).tolist()
    errors_high = (data['0.975'] - data['Coef.']).tolist()
    errors = [errors_low, errors_high]
    
    ax.errorbar(coefficients, range(len(variables)), xerr=errors, fmt='o', capsize=3, elinewidth=1.5, color=color)
    ax.axvline(x=0, color='black', linestyle='--')
    ax.set_xlim(-3, 3)
    ax.set_yticks(range(len(variables)))
    ax.set_yticklabels(variables)
    # 新增:反转Y轴方向
    ax.invert_yaxis()
    ax.set_xlabel('Point Estimate')
    ax.set_ylabel('')
    ax.set_title(title)
    
    plt.tight_layout()
    plt.savefig(filename)  # Save the figure
    plt.show()

# Colors from the screenshot
colors = ['#b5d1ae', '#80ae9a', '#568b87', '#326b77', '#1b485e', '#122740']

# Plot ITT Results
plot_itt_coefficients(itt_df, 'ITT', colors[0], 'ITT_Results.png')

说明

修复后,Y轴分类变量将按照Most Similar → Moderately Similar → Distinct → Most Distinct的顺序从上到下显示,符合预期需求。

内容的提问来源于stack exchange,提问作者Gal Bitton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 13:34:56