如何用Plotly制作X轴以周数为数据、月份为标签的年度折线图
问题
我有一个包含4列的DataFrame,列分别为year、month、week_no(年中的周数)以及计数字段starts。想要绘制折线图,展示各年度的starts数量,每一年一条独立折线。要求X轴以week_no为数据,但轴标签显示月份,类似示例图效果。
DataFrame示例数据:
| year | month | week_no | starts |
|---|---|---|---|
| 2021 | Dec | 50 | 101 |
| 2021 | Dec | 51 | 104 |
| 2021 | Dec | 52 | 110 |
| 2022 | Jan | 1 | 111 |
| 2022 | Jan | 2 | 115 |
| 2022 | Jan | 3 | 144 |
| 2022 | Jan | 4 | 156 |
我用了以下Plotly代码,但生成的图表X轴显示的是周数,没达到需求:
plot_ly(df, x = ~week_no, y = ~starts, type = 'scatter', color = ~year, mode = 'lines')
需要调整实现X轴以周数为数据、月份为标签的折线图。
解决方案
要实现这个需求,核心是保留week_no作为绘图的基准数据,同时用月份替换周数作为X轴的刻度标签,具体步骤如下:
- 预处理数据,确定月份对应的周数刻度点
先为每个year-month分组找到最小的week_no,这个值就是该月份在X轴上的刻度位置,同时生成对应的月份标签:
library(dplyr) # 生成月份刻度的位置和标签 month_ticks <- df %>% group_by(year, month) %>% summarise(week_pos = min(week_no)) %>% ungroup() %>% mutate(tick_label = paste(month, year))
- 配置Plotly图表的X轴
在layout()中通过tickvals指定刻度对应的周数位置,ticktext指定要显示的月份标签,同时保留原有的周数作为绘图数据:
library(plotly) plot_ly(df, x = ~week_no, y = ~starts, type = 'scatter', color = ~year, mode = 'lines') %>% layout( xaxis = list( tickvals = month_ticks$week_pos, ticktext = month_ticks$tick_label, title = "月份" ), yaxis = list(title = "Starts数量") )
- 可选优化
如果希望标签更简洁,可以调整标签格式,比如只显示月份缩写和年份后两位:
month_ticks <- month_ticks %>% mutate(tick_label = paste(month, substr(year, 3,4)))
这样生成的折线图会以周数保证折线的位置准确性和连续性,同时X轴显示对应的月份标签,完全符合需求。
内容的提问来源于stack exchange,提问作者Nick Read
相关产品推荐
相关产品推荐

