如何设置垂直茎叶图的分组名称为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
相关产品推荐
相关产品推荐

