Проблемы с построением временного ряда в ggplot с легендами (цены акций)

Я пытаюсь построить цены на акции с индикаторами, однако не могу понять, как добавить метки на график. Я думаю, что у меня проблемы с пониманием того, как 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")

Пожалуйста, добавьте dput(yourdata) правильно, в том, что включено, есть опечатки!

Duck 18.12.2020 20:39

На самом деле реализован хороший метод временных рядов, попробуйте plot(df) (library(xts) должен быть загружен).

jay.sf 18.12.2020 20:43
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
0
2
204
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

один из способов сделать это, чтобы преобразовать ваш 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 в виде гистограммы внизу?

Jerald Achaibar 18.12.2020 22:13

простым выходом было бы не фильтровать какую-либо переменную, а затем использовать facet_wrap(~Variable, scales = "free") после вызова geom_line() (с + между ними). ​​Таким образом, у вас будет 4 отдельных линейных графика, по одному для каждой переменной и каждый со своей шкалой. Все остальное немного сложнее

DPH 18.12.2020 22:42

У вас есть серия 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)

Другие вопросы по теме