使用matplotlib和pandas绘制堆叠柱状图时月份排序异常如何解决
问题原因
你遇到的月份排序错乱问题,本质是Pandas默认将字符串类型的列名按字典序排序展示,而月份名称的字典序和自然时间顺序不匹配,才会出现顺序异常。
解决方法
有两种常用的修复方案,按需选择即可:
方案1:手动重排DataFrame列顺序(简单快捷)
提前定义好正确的月份先后顺序,创建DataFrame后直接按该顺序重排列即可,代码修改量最小:
import pandas as pd import matplotlib.pyplot as plt years=["2016","2017","2018","2019","2020", "2021"] # 先定义按自然时间排序的月份列表,要和dataavail的key完全匹配(注意大小写) month_order = ["january", "February", "March", "April", "may", "June", "July", "August", "September", "October", "November", "December"] dataavail={ "january":[20,0,0,0,10,21], "February":[20,13,10,18,15,45], "March":[20,20,10,15,18,78], "April":[20,20,10,15,18,75], "may":[20,20,10,15,18,78], "June":[20,20,10,15,18,78], "July":[20,20,10,15,18,78], "August":[20,20,10,15,18,78], "September":[20,20,10,15,18,78], "October":[20,20,10,15,18,78], "November":[20,20,10,15,18,78], "December":[20,20,0,0,0,20], } df=pd.DataFrame(dataavail,index=years) # 按预设的月份顺序重排列 df = df[month_order] df.plot(kind="bar",stacked=True,figsize=(10,8)) # 注意原代码loc参数拼写错误,应为center不是centre plt.legend(loc="center",bbox_to_anchor=(0.8,1.0)) plt.show()
方案2:使用有序分类类型固定顺序(适合长期复用)
如果后续还要多次对该月份数据做排序、分组等操作,可以把列名转为Pandas的有序Categorical类型,全局固定顺序:
# 创建df后添加这行代码即可,month_order和方案1里的定义一致 df.columns = pd.Categorical(df.columns, categories=month_order, ordered=True)
后续所有涉及列排序的操作都会自动遵循你定义的月份顺序,不需要每次手动重排。
内容的提问来源于stack exchange,提问作者manas
相关产品推荐
相关产品推荐

