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

如何制作共享属性无分隔线的子图水平条形图并解决四类显示问题

解决Matplotlib面板式横向柱状图的四类问题

需求:基于给定DataFrame制作面板供应商风格的横向柱状图,现有代码存在4类问题,以下是修正方案及完整代码。

修正后完整代码

import pandas as pd
import matplotlib.pyplot as plt

# 示例数据(实际使用时替换为pd.read_excel('my_folder/list_of_softwares.xlsx'))
data = [
    ["Tableau", 7935, 68, 474, 712],
    ["Tableau", 69, 518, 695, 122],
    ["Oracle", 651, 540, 842, 764],
    ["Oracle", 700, 52, 776, 948],
    ["Oracle", 758, 862, 182, 757],
    ["IBM", 999, 271, 847, 338],
    ["IBM", 316, 128, 395, 441],
    ["IBM", 915, 199, 1000, 747],
    ["IBM", 44, 685, 818, 427],
    ["Tibco", 500, 575, 876, 450],
    ["Board", 748, 936, 367, 771],
    ["Board", 304, 700, 856, 77],
    ["Board", 623, 974, 120, 802],
    ["Board", 131, 151, 395, 410],
    ["Board", 217, 645, 996, 537],
    ["LogiXML", 630, 779, 752, 433],
    ["LogiXML", 947, 391, 280, 109]
]
df = pd.DataFrame(data, columns=["Software", "Parameters", "Reports", "Dashbords", "Scorecards"])

sums = df.groupby('Software').sum().T

fig, axes = plt.subplots(1, len(sums.index), sharey=True, figsize=(14, 4))
plt.subplots_adjust(wspace=0)

colors = ['#6caddf', '#f27077', '#9dd374', '#fab26a']

for idx, (ax, parameter, color) in enumerate(zip(axes, sums.index, colors)):
    ax.barh(sums.loc[parameter].index, sums.loc[parameter].values, color=color)
    
    # 移除y轴刻度
    ax.set_yticks([])
    
    # 子图标题置于内部右上角
    ax.text(0.95, 0.95, parameter, transform=ax.transAxes, 
            ha='right', va='top', fontweight='bold')
    
    # 设置x轴刻度并旋转标签解决重叠
    ax.set_xticks(range(0, df.drop('Software', axis=1).max().max() + 2000, 2000))
    ax.tick_params(axis='x', rotation=45)
    
    # 移除子图间分隔竖线(保留最后一个子图的右侧边框)
    if idx != len(axes) - 1:
        ax.spines['right'].set_visible(False)
    
    # 隐藏顶部边框优化视觉效果
    ax.spines['top'].set_visible(False)

fig.suptitle('Summary of Softwares', y=1.02, fontweight='bold')

plt.tight_layout()
plt.show()

问题对应解决说明

  • 移除所有y轴刻度:通过ax.set_yticks([])清空y轴刻度,结合sharey=True实现所有子图同步隐藏。
  • 子图标题置于内部:替换原ax.set(title=...)为ax.text(),利用轴坐标系(0-1范围)将标题定位在子图右上角,确保在图表内部。
  • 解决x轴刻度重叠:加宽图表figsize、旋转x轴刻度标签(rotation=45)、调用plt.tight_layout()自动调整间距,三重保障标签完整显示。
  • 移除子图间分隔竖线:遍历子图时隐藏除最后一个外所有子图的右侧边框,配合wspace=0让子图紧密贴合,消除中间分隔线。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 13:20:08