如何按WeekDay与WeekNo绘制月度发生次数折线图?
实现按周区分的星期次数折线图
嘿,这需求很清晰,我用Python的pandas处理数据,seaborn+matplotlib来绘图,完全能满足你的要求!下面是一步步的实现方案:
步骤1:数据准备与预处理
首先我们把你的数据整理成DataFrame,并且统一星期几的格式并指定顺序——这很重要,不然x轴的星期会乱序显示。比如把缩写的Wed、Thursd等补全,然后设置成有序的类别:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 模拟你的数据(如果是真实数据,直接用pd.read_csv读取即可) data = [ ["2018-01-01", 214.0, "Monday", 1, 2018, 1], ["2018-01-02", 232.0, "Tuesday", 1, 2018, 1], ["2018-01-03", 147.0, "Wed", 1, 2018, 1], ["2018-01-04", 257.0, "Thursd", 1, 2018, 1], ["2018-01-05", 164.0, "Friday", 1, 2018, 1], ["2018-01-06", 187.0, "Saturd", 1, 2018, 1], ["2018-01-07", 201.0, "Sunday", 1, 2018, 1], ["2018-01-08", 141.0, "Monday", 2, 2018, 1], ["2018-01-09", 152.0, "Tuesday", 2, 2018, 1], ["2018-01-10", 167.0, "Wednesd", 2, 2018, 1], ["2018-01-15", 113.0, "Monday", 3, 2018, 1], ["2018-01-16", 139.0, "Tuesday", 3, 2018, 1], ["2018-01-17", 159.0, "Wednesd", 3, 2018, 1], ["2018-01-18", 202.0, "Thursd", 3, 2018, 1], ["2018-01-19", 207.0, "Friday", 3, 2018, 1] ] df = pd.DataFrame(data, columns=["date", "value", "WeekDay", "WeekNo", "Year", "Month"]) # 统一星期几的名称,避免缩写导致的混乱 weekday_map = { "Monday": "Monday", "Tuesday": "Tuesday", "Wed": "Wednesday", "Wednesd": "Wednesday", "Thursd": "Thursday", "Friday": "Friday", "Saturd": "Saturday", "Sunday": "Sunday" } df["WeekDay"] = df["WeekDay"].map(weekday_map) # 设置星期的顺序,确保x轴从周一到周日排列 weekday_order = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"] df["WeekDay"] = pd.Categorical(df["WeekDay"], categories=weekday_order, ordered=True)
步骤2:绘制折线图
用seaborn.lineplot可以轻松实现按WeekNo区分颜色的折线,自动生成图例,代码非常简洁:
# 设置绘图风格 sns.set_style("whitegrid") # 创建画布 plt.figure(figsize=(10, 6)) # 绘制折线图:x轴是WeekDay,y轴是value,按WeekNo区分颜色 sns.lineplot( data=df, x="WeekDay", y="value", hue="WeekNo", # 按周数区分颜色 marker="o", # 显示每个数据点 linewidth=2 # 设置折线宽度 ) # 添加标题和轴标签 plt.title("2018年1月各周每日发生次数变化", fontsize=14) plt.xlabel("星期", fontsize=12) plt.ylabel("发生次数", fontsize=12) # 调整图例位置,避免遮挡图形 plt.legend(title="周数", bbox_to_anchor=(1.05, 1), loc="upper left") # 自动调整布局,防止标签被截断 plt.tight_layout() # 显示图形 plt.show()
效果说明
- 不同的
WeekNo会用不同颜色的折线表示,图例里会标注对应的周数 - x轴严格按照周一到周日的顺序排列,不会出现乱序
- 每个数据点用圆形标记,方便查看具体数值位置
- 如果你的数据里有缺失的日期(比如1月11-14日),对应的位置不会有折线连接,完全符合实际数据情况
内容的提问来源于stack exchange,提问作者J.Doe
相关产品推荐
相关产品推荐

