如何将多级索引Series绘图的X轴刻度改为月份名称?
多级索引Series绘图替换X轴为月份名称的方案
方案1:预处理索引后绘图
先把多级索引里的数字月份替换成英文名称,再绘图并调整刻度避免重复显示:
import pandas as pd import calendar import matplotlib.pyplot as plt # 提取外层month索引,映射为英文月份名称 month_names = [calendar.month_name[month] for month in series.index.get_level_values('month')] # 重构多级索引,替换原month字段为名称 new_idx = pd.MultiIndex.from_tuples( zip(month_names, series.index.get_level_values('day')), names=['month', 'day'] ) series_renamed = series.reindex(new_idx) # 绘图 ax = series_renamed.plot.line(figsize=(20,10)) # 只保留每个月份的第一个刻度位置 unique_months = series_renamed.index.get_level_values('month').unique() tick_positions = [series_renamed.index.get_loc((m, series_renamed.index.get_level_values('day')[series_renamed.index.get_level_values('month') == m][0])) for m in unique_months] ax.set_xticks(tick_positions) ax.set_xticklabels(unique_months) plt.show()
方案2:直接修改已绘制的坐标轴
如果已经执行了绘图代码,无需重新绘图,直接获取坐标轴对象修改刻度:
import calendar import matplotlib.pyplot as plt # 先执行你的原有绘图代码 ax = series.plot.line(figsize=(20,10)) # 提取唯一数字月份并排序,映射为英文名称 sorted_months = sorted(series.index.get_level_values('month').unique()) month_labels = [calendar.month_name[m] for m in sorted_months] # 定位每个月份第一个数据点的位置作为刻度点 tick_pos = [] for m in sorted_months: first_day = series.index.get_level_values('day')[series.index.get_level_values('month') == m][0] tick_pos.append(series.index.get_loc((m, first_day))) # 替换X轴刻度和标签 ax.set_xticks(tick_pos) ax.set_xticklabels(month_labels) plt.show()
补充说明
- 如果你的
month索引不是1-12的数字格式,需要自定义映射字典,示例:
之后把代码里的month_map = { 1: 'January', 2: 'February', 3: 'March', 4: 'April', 5: 'May', 6: 'June', 7: 'July', 8: 'August', 9: 'September', 10: 'October', 11: 'November', 12: 'December' }calendar.month_name[m]替换为month_map[m]即可。 - 若希望X轴更简洁,可根据需求调整刻度的显示频率或位置。
内容的提问来源于stack exchange,提问作者Mohd yousuf khan
相关产品推荐
相关产品推荐

