第七章 时间序列可视化课堂练习
1 案例数据
1.1 all_stock_2024:工商银行、招商应用、中信证券和贵州茅台四个股票2024各天交易数据
data
为为日期变量,但该日期变量不规则(不连续),周末和公众假期没有交易数据;编码
和名称
用于识别不同股票,注意不同股票有交易数据日期不一定一致,但本例种各股票均有242个交易日数据;开盘
价到换手率
均为数值变量,开盘
价到成交量
与每股资产有关,不同股票间不可比;交易量的单位为手(百股)、成交额的单位为元,振幅等四个变量均为相对指标。
2 折线图和面积图
2.1 合并折线图
将四只股票的
涨跌幅
做作折线图,将四条折线在同一个图形输出;日期截取
2024-9-1
到2024-10-31
;添加一条纵轴为0的参考线,采用
twodash
的线型;将图标题改为“合并涨跌幅折线图”。
2.2 分面折线图
将四只股票的
收盘
价格做作折线图,将四条折线图分面输出;日期截取一整年;
并使用
ggpol::geom_tshighlight
将2024-9-1
到2024-10-31
时间段高亮显示
2.3 面积图
将四只股票的成交量 价格做作面积图,将四个面积图分面输出;
将成交量的单位改为万手
2.4 图形观察和代码编写的心得体会
1.合并折线图能直观对比多组数据趋势,但需注意颜色区分度和图例位置。代码中通过aes(color=名称)实现自动分色,图例内嵌避免遮挡数据。
日期筛选使用filter()配合逻辑运算符,注意日期格式需与数据一致。横轴日期标签通过scale_x_date()灵活控制,breaks和labels参数配合提升可读性。
参考线用geom_hline()添加,twodash线型比虚线更醒目。标题修改直接通过ggtitle()实现,建议统一使用主题设置规范字体大小。
分面绘图时facet_wrap()配合scale=“free”能自适应刻度,但需注意分面过多会导致图形过小。成交量单位转换(/10000)直接在aes()中处理更高效。
主题优化经验:移除次要网格线(panel.grid.minor)提升简洁性,x轴文本旋转(angle=90)避免标签重叠,图例删除(legend.position=“none”)在分面时更合理。
交互高亮(geom_tshighlight)需确保日期格式转换正确,alpha参数控制填充透明度避免遮挡主线。
面积图适合展示体量变化,y轴标签通过ylab()动态更新单位,注意单位换算需在图表中明确标注。
3 流线图和地平线图
3.1 流线图
将四只股票的
成交额
做作流线图,将四个面积图分面输出;将成交额的单位改为亿元
3.2 地平线图
- 采用
ggHoriPlot::geom_horizon
函数,对四只股票的成交额
做作地平线图 - 设置原点为均值
origin='mean'
,输出配色图例
3.3 图形观察和代码编写的心得体会
1. 流线图(Stream Plot)
用途:适用于展示多组时间序列数据的 相对占比变化,比堆叠面积图更流畅自然。
关键参数:bw
(带宽)控制平滑度,值越小越精细,但可能产生锯齿。
group
和fill
确保数据按股票分组并填充颜色。
ylab()
直接修改单位(亿元),避免后续误解。
2. 地平线图(Horizon Plot)
用途:紧凑展示 数据偏离基准(如均值)的程度,适合高密度时间序列对比。
关键参数:origin='mean'
以均值为基准,正负值用不同颜色区分。
horizonscale=10
控制分层数量,值越大颜色过渡越细腻。
scale_fill_hcl(palette='RdYlBu')
使用红-黄-蓝渐变,增强正负对比。
4 不规则时间序列图
4.1 数据准备
通过
zoo::rollmean
时间收盘价的5天、10天和20天的移动平均将日期变量转化为
id
变量
4.2 平滑曲线图
将四只股票收盘价和3种移动平均的折线图分面输出;
横轴的每隔30天一个刻度,只显示月/日;
4.3 K线图
选择工商银行数据作出,2024年的K线图
scale_x_continuous
将横轴坐标刻度转化回日期型
4.4 图形观察和代码编写的心得体会
1. 数据准备(移动平均计算)
zoo::rollmean
计算移动平均时,关键参数:k
控制窗口大小(5/10/20天),align="right"
表示右对齐(当前点及前k-1天)。
fill=NA
避免初始无移动平均值的点被插值干扰。
数据转换:- 将日期转为
date_index
(连续整数)便于后续横轴刻度调整,但需注意 日期与索引的映射关系,避免标签错位。
4.4.1 2. 平滑曲线图(分面输出)
- 数据整理:
gather()
将收盘价和移动平均线转为长格式,适合ggplot2
绘图。
- 横轴优化:
scale_x_continuous(breaks=seq(1, 242, by=30))
每30天一个刻度,labels
通过日期索引映射回“月-日”格式。
- 分面技巧:
facet_wrap(~名称, ncol=2, scale="free")
自由刻度适配不同股票价格范围,ncol=2
控制布局。
4.4.2 3. K线图(工商银行)
- 核心元素:
- 柱体(蜡烛):
geom_rect
用矩形表示开盘-收盘区间,fill
按涨跌(红涨绿跌)。
- 影线:
geom_segment
绘制最高-最低价线段。
- 移动平均线:叠加
geom_line
,通过color
区分不同周期。
- 柱体(蜡烛):
- 横轴日期还原:
scale_x_continuous(labels=format(...))
将索引映射回日期标签,确保刻度与数据对齐。
4.4.3 通用经验总结
- 移动平均计算:
- 窗口大小需结合分析目标(短期波动用
ma5
,长期趋势用ma20
)。
- 缺失值处理(如
fill=NA
)避免误导性平滑。
- 窗口大小需结合分析目标(短期波动用
- 时间轴处理:
- 索引化日期可简化刻度控制,但需谨慎映射标签(如
seq(1, nrow(df), by=30)
)。
- 索引化日期可简化刻度控制,但需谨慎映射标签(如
- 分面与图例:
- 分面图建议移除冗余图例(
guides(color="none")
),避免重复。
- 分面图建议移除冗余图例(
- K线图细节:
- 影线宽度(
x ± 0.4
)和颜色对比(红/绿)直接影响可读性。
- 移动平均线颜色需与K线区分(如蓝/橙/紫)。
- 影线宽度(