这是因为:第一,quantmod包的画图对我来说没有足够的灵活性,我不能很自如地控制每一个要素,添加我想要的东西;第二,quantmod包的分析是基于xts的时间序列对象,而在日常工作中,已经习惯了用tbl_df体系,也确实好用,而该体系的作图对应的就是ggplot2这一强大的工具。
好了,不说废话了,直接开始。
数据是2017年上证综指每日的开盘,最高,最低、收盘和成交量数据,在这个文件中,变量名"SHDX2017"。
- SHDX2017.RData
开始作图:
- library(tidyverse)
- library(gridExtra)
- library(quantmod) # 要用到SMA函数
- # 为了解决日期作为横坐标会出现休市日的情况,需要以下的变量辅助
- row_len <- nrow(SHDX2017)
- breaks <- seq(1, row_len, 10)
- labels <- SHDX2017$date[breaks]
- # 作K线图
- p1 <- SHDX2017 %>%
- arrange(date) %>%
- mutate(ma5 = SMA(close, n = 5, align = "right"),
- ma10 = SMA(close, n = 10, align = "right"),
- date_axis = row_number()) %>%
- ggplot(aes(x = date_axis)) +
- geom_boxplot(aes(lower = pmin(close, open),
- middle = close,
- upper = pmax(close, open),
- ymin = low,
- ymax = high,
- group = date_axis,
- fill = open > close),
- stat = "identity",
- show.legend = FALSE) +
- geom_line(aes(y = ma5), color = "blue3") +
- geom_line(aes(y = ma10), color = "red") +
- scale_x_continuous(breaks = breaks,
- labels = NULL,
- expand = c(0, 0)) +
- theme(axis.ticks.x = element_blank(),
- axis.title = element_blank(),
- axis.text.y = element_text(margin = margin(l = 8)))
- # 作成交量图
- p2 <- SHDX2017 %>%
- arrange(date) %>%
- mutate(vol_ma5 = SMA(volume, n = 5, align = "right"),
- vol_ma10 = SMA(volume, n = 10, align = "right"),
- date_axis = row_number()) %>%
- ggplot(aes(x = date_axis, y = volume)) +
- geom_bar(stat = "identity",
- aes(fill = open > close),
- show.legend = FALSE) +
- geom_line(aes(y = vol_ma5), color = "blue3") +
- geom_line(aes(y = vol_ma10), color = "red") +
- scale_x_continuous(breaks = breaks,
- labels = format(labels, "%m-%d"),
- expand = c(0, 0)) +
- scale_y_continuous(expand = c(0, 0.5)) +
- theme(axis.title = element_blank())
- # 组合
- grid.arrange(p1, p2, nrow = 2, heights = 2:1)
作出的图像这样: