在Julia中实现类似Excel数据透视表的双层X轴刻度标签绘图
同一侧双层X轴标签图表实现方案
需求说明
需要绘制的图表X轴包含两层标签:上层为购买月份,下层为商品名称,所有标签都在X轴同一侧(下方区域),对应数据如下:
| Month | Item | Price |
|---|---|---|
| Feb | Tomatoe | 15 |
| Feb | Cockies | 10 |
| Feb | Juice | 20 |
| Feb | Orange | 13 |
| Mar | Cake | 11 |
| Mar | Potato | 30 |
| Mar | Juice | 13 |
实现思路(Matplotlib)
放弃twiny()生成另一侧轴的方式,直接在主X轴上方添加月份标签层,通过位置计算和样式控制实现同一侧双层效果,核心步骤:
- 以商品名称为基础绘制主X轴,对应每个数据点位置
- 按月份分组,计算每组商品的位置区间,在区间中心放置月份标签
- 隐藏上层轴的冗余线条,只保留标签,与主X轴标签形成双层结构
完整代码示例
import matplotlib.pyplot as plt import pandas as pd # 加载并整理数据 data = pd.DataFrame({ 'Month': ['Feb', 'Feb', 'Feb', 'Feb', 'Mar', 'Mar', 'Mar'], 'Item': ['Tomatoe', 'Cockies', 'Juice', 'Orange', 'Cake', 'Potato', 'Juice'], 'Price': [15, 10, 20, 13, 11, 30, 13] }) # 创建绘图对象 fig, ax = plt.subplots(figsize=(8, 5)) # 绘制柱状图,主X轴为商品名称 x_indices = range(len(data)) ax.bar(x_indices, data['Price'], tick_label=data['Item']) # 计算每个月份对应的X轴中心位置 month_center_pos = [] for month, group in data.groupby('Month'): group_indices = group.index center = (group_indices.min() + group_indices.max()) / 2 month_center_pos.append((center, month)) # 添加上层月份标签轴 top_ax = ax.twiny() # 设置上层轴刻度和标签,仅保留顶部标签 top_ax.set_xticks([pos for pos, _ in month_center_pos]) top_ax.set_xticklabels([month for _, month in month_center_pos]) top_ax.tick_params(axis='x', bottom=False, top=True, labelbottom=False, labeltop=True) # 隐藏上层轴的边框线 top_ax.spines['top'].set_visible(False) # 自动调整布局,避免标签重叠 plt.tight_layout() plt.show()
方案优势
相比Excel透视表,该代码方案处理大量数据时性能更稳定,且支持自定义标签样式、图表类型,灵活性更高,完全通过代码控制布局细节。
内容的提问来源于stack exchange,提问作者Alejandro Ferreira
相关产品推荐
相关产品推荐

