Я пытаюсь построить цены на акции с индикаторами, однако не могу понять, как добавить метки на график. Я думаю, что у меня проблемы с пониманием того, как ggplot работает с временными рядами. Я видел, как другие создают новый столбец со всеми данными, но я не понимаю, как это будет применяться здесь. Первоначально я хотел построить цену закрытия вместе со скользящими средними за 50 и 200 дней и меткой, чтобы показать их соответственно.
вот данные и график без меток. Также приветствуются любые ресурсы для получения дополнительной информации о ggplot.
structure(c(3.320236, 3.300589, 3.483955, 3.588736, 3.418468,
3.497053, 3.549443, 3.582187, 3.601834, 3.588736, 1803600, 2480600,
2608100, 2315800, 3706400, 2648200, 1851400, 1297000, 2230600,
1667900, 4.04544857999999, 4.01964633999999, 4.00091679999999,
3.98559263999999, 3.96987555999999, 3.95442041999999, 3.94407331999999,
3.93791745999999, 3.92586769999999, 3.91892597999999, 4.80337260999993,
4.79541582999993, 4.78650947499993, 4.77812702499993, 4.76981006499993,
4.76195151999993, 4.75271772499993, 4.74482643499993, 4.73775374499993,
4.72956775999993, 169569500, 167088900, 169697000, 172012800,
168306400, 170954600, 172806000, 174103000, 176333600, 174665700,
3.32023599999963, 3.30058899999973, 3.48395499999974, 3.58873599999971,
3.41846799999982, 3.49705299999975, 3.54944299999964, 3.58218699999948,
3.6018339999997, 3.5887359999996), class = c("xts", "zoo"), index = structure(c(1546387200,
1546473600, 1546560000, 1546819200, 1546905600, 1546992000, 1547078400,
1547164800, 1547424000, 1547510400), tzone = "UTC", tclass = "Date"), .Dim = c(10L,
6L), .Dimnames = list(NULL, c("SPWR.Close", "SPWR.Volume", "SMA",
"SMA.1", "obv", "VWAP")))
ggplot(data = df, aes(x = Date, y = Price)) +
geom_line(aes(y = SPWR.Close)) +
geom_line(aes(y = SMA), col = "red") +
geom_line(aes(y = SMA.1), col = "blue")
На самом деле реализован хороший метод временных рядов, попробуйте plot(df)
(library(xts)
должен быть загружен).
один из способов сделать это, чтобы преобразовать ваш TS в фрейм данных и преобразовать имена строк в новый столбец. Затем измените порядок данных, чтобы построить их в краткой форме.
# needed libraries
library(ggplot2)
library(dplyr)
library(tidyr)
# your dummy data
df <- structure(c(3.320236, 3.300589, 3.483955, 3.588736, 3.418468,
3.497053, 3.549443, 3.582187, 3.601834, 3.588736, 1803600, 2480600,
2608100, 2315800, 3706400, 2648200, 1851400, 1297000, 2230600,
1667900, 4.04544857999999, 4.01964633999999, 4.00091679999999,
3.98559263999999, 3.96987555999999, 3.95442041999999, 3.94407331999999,
3.93791745999999, 3.92586769999999, 3.91892597999999, 4.80337260999993,
4.79541582999993, 4.78650947499993, 4.77812702499993, 4.76981006499993,
4.76195151999993, 4.75271772499993, 4.74482643499993, 4.73775374499993,
4.72956775999993, 169569500, 167088900, 169697000, 172012800,
168306400, 170954600, 172806000, 174103000, 176333600, 174665700,
3.32023599999963, 3.30058899999973, 3.48395499999974, 3.58873599999971,
3.41846799999982, 3.49705299999975, 3.54944299999964, 3.58218699999948,
3.6018339999997, 3.5887359999996), class = c("xts", "zoo"), index = structure(c(1546387200, 1546473600, 1546560000, 1546819200, 1546905600, 1546992000, 1547078400, 1547164800, 1547424000, 1547510400), tzone = "UTC", tclass = "Date"), .Dim = c(10L, 6L), .Dimnames = list(NULL, c("SPWR.Close", "SPWR.Volume", "SMA", "SMA.1", "obv", "VWAP")))
# convert to df
df1 <- as.data.frame(df)
# rownames (dates) to a new column
df1$DATE <- rownames(df1)
df1 %>%
# get data in a better format to print
tidyr::pivot_longer(-DATE, names_to = "Variable", values_to = "Values") %>%
# fitler the variable you want to print
dplyr::filter(Variable %in% c("SPWR.Close", "SMA", "SMA.1")) %>%
# plot using the group feature of ggplot2
ggplot2::ggplot(aes(x = DATE, y = Values, group = Variable, color = Variable)) +
ggplot2::geom_line()
Да, это работает хорошо, но что, если я хочу сделать один из графиков разбросом, используя функцию geom_point
? или предположим, что я хочу построить SPWR.volume в виде гистограммы внизу?
простым выходом было бы не фильтровать какую-либо переменную, а затем использовать facet_wrap(~Variable, scales = "free") после вызова geom_line() (с + между ними). Таким образом, у вас будет 4 отдельных линейных графика, по одному для каждой переменной и каждый со своей шкалой. Все остальное немного сложнее
У вас есть серия xts/zoo, но в вопросе отсутствует связанный с ней библиотечный вызов. В зоопарке есть собственные методы построения графиков для классической графики (plot.zoo), решетки (xyplot.zoo) и ggplot2 (autoplot.zoo).
Мы проиллюстрируем каждый ниже, используя точки для закрытия, столбцы гистограммы для объема и линии для всех других столбцов, используя 3 панели со второй панелью для объема, третьей для OBV и всеми остальными столбцами, нанесенными на первую панель.
1) plot.zoo Используя plot.zoo (мы показываем autoplot.zoo в конце), аргументы screen, col и type имеют по одному элементу на столбец, указывающий номер панели (или метку) через screen=, цвет через col= и тип ( p = точка, l = линия, h = гистограмма) через type= для этого столбца. В легенде мы указываем позицию в первом аргументе, текст легенды во втором аргументе, цвет через col=, тип точки для столбцов, нарисованных в виде точек (20 = закрашенная точка) через pch=, тип линии для столбцов, нарисованных в виде линий (1 = сплошная линия) через lty=, ширина линий через lwd=, размер точек через pt.cex=, размер текста через cex=, отсечение (TRUE = подавление отсечения) через xpd= и рамку (n = без рамки вокруг легенды) через bty=.
library(xts)
plot(transform(as.zoo(x),
SPWR.Volume = SPWR.Volume / 1000,
obv = obv / 1000000),
main = "SPWR",
ylab = c("Price", "Volume", "OBV"),
screen = c(1, 2, 1, 1, 3, 1),
col = c("black", "blue", "green", "red", "black", "purple"),
type = c("p", "h", "l", "l", "l", "l"),
lwd = 2,
heights = c(4, 1, 1)
)
legend("topleft", c("SMA", "SMA.1", "VWAP", "Close"),
col = c("green", "red", "purple", "black"),
pch = c(NA, NA, NA, 20), lty = c(1, 1, 1, NA),
lwd = 2, pt.cex = 1.2, cex = 0.7, xpd = TRUE, bty = "n")
2) xyplot.zoo xyplot.zoo использует решетчатую графику. Вызов чем-то похож на plot.zoo.
library(lattice)
library(xts)
xyplot(transform(as.zoo(x),
SPWR.Volume = SPWR.Volume / 1000,
obv = obv / 1000000),
main = "SPWR",
ylab = c("Price", "Volume", "OBV"),
screen = c("Price", "Volume", "Price", "Price", "OBV", "Price"),
col = c("black", "blue", "green", "red", "black", "purple"),
type = list("p", "h", "l", "l", "l", "l"),
lwd = 2,
par.settings = list(layout.heights = list(panel = c(4, 1, 1)/6)),
key = list(corner = c(0.05, 0.9),
lines = list(col = c("green", "red", "purple")),
text = list(c("SMA", "SMA.1", "VWAP"), cex = 0.7)
)
)
3) autoplot.zoo Это довольно сложно с ggplot2, но мы можем сделать это, создав 3 отдельных графика, а затем объединив их с помощью cowplot.
library(cowplot)
library(ggplot2)
library(xts)
xx <- transform(as.zoo(x),
SPWR.Volume = SPWR.Volume / 1000,
obv = obv / 1000000)
p1 <- autoplot(xx$SPWR.Close, geom = "point") +
geom_line(aes(y = VWAP, col = "A"), x) +
geom_line(aes(y = SMA, col = "B"), x) +
geom_line(aes(y = SMA.1, col = "C"), x) +
scale_color_manual(name = "Legend",
values = c(A = "purple", B = "green", C = "red"),
labels = c(A = "VWAP", B = "SMA", C = "SMA.1")) +
theme(legend.position = c(0.1, 0.73),
plot.margin = margin(1, 1, -0.5, 1, "cm"),
axis.text.x = element_blank(),
axis.ticks.x = element_blank()) +
ggtitle("SPWR") +
xlab("") +
ylab("Price")
p2 <- autoplot(xx$SPWR.Volume, fill = "Volume", geom = "col") +
scale_fill_manual(values = "blue") +
guides(fill = FALSE) +
theme(plot.margin = margin(-0.5, 1, -0.5, 1, "cm")) +
xlab("") +
ylab("Volume")
p3 <- autoplot(xx$obv) +
theme(plot.margin = margin(-0.5, 1, 1, 1, "cm")) +
ylab("OBV")
plot_grid(p1, p2, p3, align = "v", rel_heights = c(4, 1, 1), ncol = 1)
Пожалуйста, добавьте
dput(yourdata)
правильно, в том, что включено, есть опечатки!