直方图X轴刻度标签无法修改?如何实现按月展示累计时长
问题
我想要基于以下DataFrame绘制单个图表,X轴显示西班牙语月份标签(Ene至Dic),展示「duration」字段的累计值。但当前得到两个图表:一个带有正确月份标签但为空,另一个有所需数据但无正确标签。
样本数据
plt_users_durat.sample(5) # 输出结果: month duration 2195 12 355.20 228 05 343.49 623 08 255.84 144 05 423.85 249 06 305.84
当前代码
fig, ax = plt.subplots() # 创建示例DataFrame plt_users_durat = df_users_durat[["month","duration"]] plt_users_durat = pd.DataFrame(plt_users_durat).sort_values(by="month").reset_index(drop = True) # 绘图部分 ticks = [1,2,3,4,5,6,7,8,9,10,11,12] labs = ["Ene","Feb","Mar","Abr","May","Jun","Jul","Ago","Sep","Oct","Nov","Dic"] plt_users_durat.plot("month", "duration", rot = 45, kind="hist") plt.title('Minutos por Usuario al Mes') plt.xlabel('Mes') plt.ylabel('Duración') ax.set_xticks(ticks) ax.set_xticklabels(labs) plt.show()
当前问题现象
生成两个独立图表:一个有西班牙语月份标签但无数据,另一个显示duration的数据分布但X轴为数字月份,不符合需求。
解决方法
问题根源
- 同时使用
fig, ax = plt.subplots()创建的轴对象,以及pandasplot()默认创建的新轴,导致生成两个图表。 - 用直方图(hist)展示分类累计值是错误的:直方图用于展示数值型数据的分布,而你需要的是按月份分类的累计值,应该用柱状图(bar)。
- 原数据未按月份分组求和,直接绘图会展示单条数据的分布,而非每月累计值。
修正后的代码
import pandas as pd import matplotlib.pyplot as plt # 1. 数据预处理:按月份分组求和,得到每月累计duration plt_users_durat = df_users_durat[["month","duration"]] # 确保month是数值类型,避免字符串排序问题 plt_users_durat["month"] = pd.to_numeric(plt_users_durat["month"]) # 按月份分组求和并排序 monthly_total = plt_users_durat.groupby("month")["duration"].sum().sort_index() # 2. 创建绘图轴对象 fig, ax = plt.subplots() # 3. 绘制柱状图,指定使用已创建的ax,避免生成新图表 monthly_total.plot(kind="bar", rot=45, ax=ax) # 4. 设置X轴标签为西班牙语月份 labs = ["Ene","Feb","Mar","Abr","May","Jun","Jul","Ago","Sep","Oct","Nov","Dic"] ax.set_xticklabels(labs) # 5. 设置图表标题和坐标轴标签 ax.set_title('Minutos por Usuario al Mes') ax.set_xlabel('Mes') ax.set_ylabel('Duración') plt.tight_layout() # 自动调整布局,避免标签被截断 plt.show()
关键说明
- 先通过
groupby("month")["duration"].sum()计算每个月的累计时长,确保图表展示的是每月总和。 - 使用
ax=ax参数让pandas把图画在已创建的轴上,避免生成额外图表。 - 用
kind="bar"替换kind="hist",绘制分类柱状图而非直方图。 - 直接用
set_xticklabels替换X轴的分组标签为西班牙语月份,无需手动设置ticks。
内容的提问来源于stack exchange,提问作者RicardoDLM
相关产品推荐
相关产品推荐

