使用geom_candlestick绘制股票自定义数据时的异常图表问题
解决低成交量股票蜡烛图异常+叠加成交量双轴高亮方案
一、修复低成交量/无交易股票的蜡烛图异常
- 先修正日度数据的
close字段:无交易日的close大概率是因为汇总逻辑(比如取当日最后一条5分钟数据)沿用了前值,得强制把这些日期的close设为0。用dplyr处理示例:
library(dplyr) # 假设日度数据框名为daily_data,判断无交易的条件是open/high/low均为0 daily_data <- daily_data %>% mutate(close = ifelse(open == 0 & high == 0 & low == 0, 0, close))
- 处理完数据后再调用
tidyquant::geom_candlestick(),此时无交易日的四个价格字段都是0,会自动显示为水平线,不会出现异常柱状图。如果仍有问题,可结合ggplot原生图层绘制:
library(ggplot2) library(tidyquant) ggplot(daily_data, aes(x = date)) + geom_candlestick(aes(open = open, high = high, low = low, close = close)) + theme_tq()
二、叠加成交量双轴并高亮大额成交量
- 用
ggplot双轴功能实现左轴价格蜡烛图、右轴成交量柱状图,同时给大额成交量设置高亮颜色:
# 定义大额成交量阈值,比如取成交量的90分位数 vol_threshold <- quantile(daily_data$volume, 0.9, na.rm = TRUE) ggplot() + # 蜡烛图层(左轴) geom_candlestick(data = daily_data, aes(x = date, open = open, high = high, low = low, close = close)) + # 成交量柱状图层(右轴,这里将成交量除以10000是为了匹配价格轴范围,可按需调整缩放比例) geom_col(data = daily_data, aes(x = date, y = volume / 10000, fill = ifelse(volume > vol_threshold, "大额成交量", "普通成交量")), alpha = 0.5) + # 设置双轴映射 scale_y_continuous( name = "价格", sec.axis = sec_axis(~ . * 10000, name = "成交量") ) + # 自定义高亮颜色 scale_fill_manual(values = c("大额成交量" = "red", "普通成交量" = "gray")) + # 套用tidyquant主题 theme_tq() + labs(fill = "") + theme(legend.position = "top")
- 注意:双轴仅为视觉对齐,需自行调整成交量的缩放比例(示例中的
/10000和*10000),避免图形重叠;大额成交量的阈值可根据需求改为固定数值或其他分位数。
内容的提问来源于stack exchange,提问作者ML33M
相关产品推荐
相关产品推荐

