You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 13:03:23