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

如何设置垂直茎叶图的分组名称为X轴刻度标签并优化位置?

优化垂直茎叶图的X轴刻度标签实现

问题需求

需要反转分组数据,将分组名称作为X轴刻度标签并排绘制垂直茎叶图,原代码存在两个问题:

  • 分组标签位置不符合预期
  • 依赖ymin放置标签的方式不合理

优化后的代码

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

def main():
    data = [['AAAAAA',8],['AAAAAA',9],['AAAAAA',10],['BBBBBB',5],['BBBBBB',6],['BBBBBB',7],['CCCCCC',1],['CCCCCC',2],['CCCCCC',3],['CCCCCC',4]]
    df = pd.DataFrame(data,columns=['name','value'])

    dfg = df.groupby('name')
    fig, ax = plt.subplots(figsize=(8, 4))
    i = 0
    group_centers = []
    group_labels = []
    c1='#ececec'
    c2='#bcbcbc'
    color=c1  

    # 遍历反转后的分组
    for group_name, group_data in reversed(tuple(dfg)):
        n = len(group_data)
        # 生成当前分组的x坐标范围
        x_start = i
        x_end = i + n
        x = np.linspace(x_start, x_end, n)
        # 绘制茎叶图
        ax.stem(x, group_data['value'])
        # 记录分组中心位置和标签
        group_centers.append(x_start + n/2)
        group_labels.append(group_name)
        # 绘制分组背景色
        plt.axvspan(x_start, x_end, facecolor=color, alpha=0.5)
        # 交替背景色
        color = c2 if color == c1 else c1
        i += n

    # 设置X轴刻度和标签
    ax.set_xticks(group_centers)
    ax.set_xticklabels(group_labels, rotation=90, ha='center', va='top', 
                       fontdict={'family':'serif','color':'darkred', 'size':8})
    # 隐藏顶部和右侧边框
    ax.spines[["top", "right"]].set_visible(False)
    # Y轴网格设置
    ax.grid(axis='y', color='gray', linestyle='dashed', alpha=1)
    
    fig.tight_layout() 
    plt.show()

if __name__ == "__main__":
    main()

关键优化点

  • 替换标签放置方式:不再用ax.text手动定位标签,而是通过ax.set_xticks和ax.set_xticklabels直接绑定分组中心位置与标签,自动对齐分组区域,彻底摆脱对ymin的依赖
  • 分组坐标管理:记录每个分组的中心位置,确保标签精准居中在对应分组上方
  • 视觉细节优化:调整标签的旋转对齐参数,保证文字显示清晰,同时保留原有的交替背景色和网格样式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 17:02:25