使用pandas/pyplot绘制柱状图时设置UTC时区X轴排序顺序
解决UTC时区柱状图的X轴排序问题
我刚好碰到过类似的需求,给你一套清晰的解决方案:
核心思路
value_counts(sort=False)只能按数据中首次出现的顺序排列,但我们需要强制X轴按**-11.0到+13.0的连续整数时区**排列,所以得手动构造目标顺序,再用reindex重新对齐频次数据。
具体步骤
获取时区频次(可选包含NaN)
先拿到每个时区的频次统计,如果需要把NaN也作为一个类别统计,记得加dropna=False:import pandas as pd # 假设你的DataFrame叫df timezone_counts = df['UTC_Hrs'].value_counts(dropna=False)构造目标X轴顺序
生成我们想要的-11到13的浮点数列表(因为你的UTC_Hrs是浮点类型):# 生成-11到13的整数,再转成float匹配列类型 desired_x_order = [float(hour) for hour in range(-11, 14)] # range(-11,14)会包含-11到13重新对齐频次数据
用reindex把频次数据按目标顺序排列,没有数据的时区频次填0:ordered_counts = timezone_counts.reindex(desired_x_order, fill_value=0)如果不想显示频次为0的时区,可以再加一步过滤:
ordered_counts = ordered_counts[ordered_counts > 0]绘制柱状图
用pandas自带的绘图或者matplotlib都可以:import matplotlib.pyplot as plt ordered_counts.plot(kind='bar', figsize=(12, 6)) plt.xlabel('时区(UTC)') plt.ylabel('频次') plt.title('Twitter帖子时区分布') plt.xticks(rotation=0) # 让X轴标签水平显示,更易读 plt.show()
为什么之前的方法不行?
sort=False只是保留数据中时区第一次出现的顺序,但你的数据里可能不是按-11到13的顺序出现的,所以必须手动指定我们想要的顺序,reindex是最直接的方式。
内容的提问来源于stack exchange,提问作者scatter
相关产品推荐
相关产品推荐

