如何在趋势图表中仅展示日和月维度并实现可视化
解决仅展示日/月维度的每日趋势图表问题
我来帮你搞定这个需求,你已经找对了方向,只是在字符串处理和绘图逻辑上需要调整下,给你两种实用的解决方案:
方法一:直接用原日期列,隐藏年份(推荐)
这种方式不用额外创建变量,直接借助日期格式化工具让x轴只显示日和月,同时保留日期的天然顺序,是最省心的做法:
import matplotlib.pyplot as plt import matplotlib.dates as mdates import pandas as pd # 先确保数据按日期排序(这一步很重要,避免绘图顺序混乱) df = df.sort_values('date') # 绘制趋势图 fig, ax = plt.subplots(figsize=(10, 6)) ax.plot(df['date'], df['trend_value']) # 这里trend_value替换成你的数值列名 # 设置x轴仅显示日和月,格式为「日-月」 date_formatter = mdates.DateFormatter('%d-%m') ax.xaxis.set_major_formatter(date_formatter) # 旋转x轴标签避免重叠 plt.xticks(rotation=45) plt.xlabel('Day-Month') plt.ylabel('Trend Value') plt.title('Daily Trend (Day-Month Only)') plt.tight_layout() plt.show()
方法二:创建正确排序的Day_Month字符串标签
如果你一定要用自定义的Day_Month变量,需要解决两个核心问题:字符串拼接的完整性和日期顺序的正确性(直接拼接无格式的字符串会导致排序混乱,比如"1-10"会排在"1-2"前面):
import pandas as pd import matplotlib.pyplot as plt # 第一步:确保数据按日期排序(核心前提!) df = df.sort_values('date') # 第二步:用strftime生成带前导零的日-月字符串(比如"01-01"、"01-02") df['Day_Month'] = df['date'].dt.strftime('%d-%m') # 现在绘图,x轴会严格按日期顺序展示 plt.figure(figsize=(10, 6)) plt.plot(df['Day_Month'], df['trend_value']) plt.xticks(rotation=45) plt.xlabel('Day-Month') plt.ylabel('Trend Value') plt.title('Daily Trend (Day-Month Only)') plt.tight_layout() plt.show()
你之前尝试遇到问题的原因
- 字符串拼接代码不完整,正确写法应该是
df['Day_Month'] = df['Day'].astype(str) + "-" + df['Month'].astype(str),但这种方式生成的字符串没有前导零,排序时会出现逻辑错误; - 直接把这类字符串转日期类型,Python会自动补默认年份(比如1900),反而违背了你「忽略年份」的需求;
- 如果数据没有预先按日期排序,即使字符串看起来正确,绘图时的顺序也会混乱。
内容的提问来源于stack exchange,提问作者Efrat Amir-Caspi
相关产品推荐
相关产品推荐

