Как построить несколько строк в R

Я хотел бы построить графики с несколькими строками в R следующим образом: Как построить несколько строк в R

  • 2 линии
  • ось х - дата
  • ось y - это возврат журнала

У меня есть данные в 3 векторах

print(class(TradeDate))
print(class(ArimaGarchCurve))
print(class(CompareCurve))
---------------------------------------------
[1] "factor"
[1] "numeric"
[1] "numeric"

Я искал и обнаружил, что xyplot может быть полезен, но я не знаю, как его использовать. Я пытался.

pdf("Testing.pdf")
plotData <- data.frame(Date=TradeDate,
                       Arima=ArimaGarchCurve,
                       BuyHold=BuyHoldCurve)
print(xyplot(
    Arima ~ Date,
    data=plotData,
    superpose=T,
    col=c("darkred", "darkblue"),
    lwd=2,
    key=list(
        text=list(
            c("ARIMA+GARCH", "Buy & Hold")
        ),
        lines=list(
            lwd=2, col=c("darkred", "darkblue")
        )
    )
))
dev.off()

Вот результат: Как построить несколько строк в RУзнайте отсюда

Спасибо большое.

dput(head(plotData,20))
structure(list(Date = structure(1:20, .Label = c("2001-12-03", 
"2001-12-04", "2001-12-05", "2001-12-06", "2001-12-07", "2001-12-10", 
"2001-12-11", "2001-12-12", "2001-12-13", "2001-12-14", "2001-12-17", 
"2001-12-18", "2001-12-19", "2001-12-20", "2001-12-21", "2001-12-24", 
"2001-12-25", "2001-12-26", "2001-12-27", "2001-12-28", "2001-12-31", 
"2002-01-01", "2002-01-02", "2002-01-03", "2002-01-04", "2002-01-07",
"2019-05-22", "2019-05-23"), class = "factor"), Arima = c(-0.0134052258713131, 
-0.00542641764174324, 0.0128513670753771, 0.0282761455973665, 
0.0179931884968989, 0.0281714817318116, 0.0435962602538011, 0.0462004298658309, 
0.0194592964361352, 0.0248069155406948, 0.032807001046888, 0.0381120657516546, 
0.0381120657516546, 0.030090589527961, -0.0146168717909267, -0.00630652663076437, 
-0.00630652663076437, -0.00630652663076437, 0.0100429785563596, 
0.0100429785563596), BuyHold = c(-0.0134052258713131, -0.00542641764174324, 
0.0128513670753771, 0.0282761455973665, 0.0384544388322794, 0.0281714817318116, 
0.0125050470584384, 0.0151092166704679, -0.0116319167592278, 
-0.0170082867113405, -0.0090082012051471, -0.00370313650038065, 
-0.00370313650038065, -0.0117246127240743, -0.056432074042962, 
-0.0481217288827996, -0.0481217288827996, -0.0481217288827996, 
-0.0317722236956757, -0.0317722236956757)), row.names = c(NA, 
20L), class = "data.frame")

Не могли бы вы dput(plotData) опубликовать результат, чтобы поделиться своими данными или создать поддельные данные, чтобы сделать ваш код воспроизводимым?

s__ 27.05.2019 10:47
drive.google.com/open?id=1JBnd5zhwWYC6R1cEA8MfQOedXPiUu3su, Вот результат dput, большое спасибо
sflee 27.05.2019 11:04

к сожалению, это не лучший вариант для обмена данными с внешними ссылками, я советую использовать dput(plotData) или dput(head(plotData,20)), чтобы получить соответственно весь ваш вывод или первые 20 строк, и опубликовать их, отредактировав свой вопрос. Пожалуйста, не думайте, что это педантичный запрос, но внешние ссылки для данных не являются правильным способом.

s__ 27.05.2019 11:07

вы пробовали ggplot2 после плавления ваших данных? что-то вроде следующего должно работать. ggplot(data.table::melt(plotData, 'Date')) + geom_line(aes(x = Date, y = value, col = variable)

davide 27.05.2019 11:53

У вас есть хорошие советы как от людей davide, так и от @s_t. Как поклонник решетки, я добавляю ответ с несколькими расширениями, которые могут вам пригодиться.

David O 27.05.2019 15:38
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
1 826
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Я думаю, что это могло бы помочь:

library(lattice)
xyplot(
  Arima + BuyHold ~ Date,                                   # here you can add log() to the two ts
  data=plotData,
  superpose=T,
  col=c("#cc0000", "#0073e6"),                              # similar colors
  lwd=2,
  key=list(
     text  = list(c("ARIMA+GARCH log", "Buy & Hold log")),
     lines = list( lwd=2, col=c("#cc0000", "#0073e6"))      # similar colors
  ), type=c("l","g")                                        # lines and grid
)

Если вы хотите уменьшить количество тиков по оси X, вы должны создать свои метки и добавить их таким образом (в этом случае один год вы должны рассчитать параметры полного временного ряда):

x.tick.number <- 1
at <- seq(1, nrow(d), length.out=x.tick.number)
labels <- round(seq(2001, 2001, length.out=x.tick.number))

В сюжете:

xyplot(
  Arima + BuyHold ~ Date,                                   # here you can add log() to the two ts
  data=d,
  superpose=T,
  col=c("#cc0000", "#0073e6"),                              
  lwd=2,
  key=list(
    text  = list(c("ARIMA+GARCH log", "Buy & Hold log")),
    lines = list( lwd=2, col=c("#cc0000", "#0073e6"))      
  ), type=c("l","g"),
  scales = list(at=at, labels=labels, rot=90))

И решетка, и ggplot предлагают решения. Несмотря на это, как предлагает @davide, «плавление» ваших данных или преобразование их из «широкого» формата в «длинный» является очень хорошей практикой. Интересующие значения помещаются в одну переменную, и создается параллельный фактор для определения группы, связанной с каждым значением.

Это можно сделать в базе R несколькими способами. Здесь показано использование stack(). Кроме того, путем преобразования факторного или символьного представления даты в объект Date процедуры построения графиков в lattice и ggplot2 помогут вам лучше управлять метками осей.

df <- data.frame(Date = as.Date(plotData$Date), stack(plotData[2:3]))
(names(df)) # stack names the data 'values and the grouping factor 'ind'
levels(df$ind) <- c("ARIMA+GARCH", "Buy & Hold") # simplifies legends

Вот несколько простой график с несколькими дополнениями для линий сетки и легенды (ключ):

xyplot(values ~ Date, data = df, groups = ind, type = c("g", "l"), auto.key = TRUE)

Графики можно настроить с помощью функций lattice через panel и элементов в auto.key. Хотя использование col = c("darkred", "darkblue") на верхнем уровне функции окрашивает линии на графике, передача его через необязательный аргумент par.settings делает его доступным для функции легенды.

xyplot(values ~ Date, data = df, groups = ind,
  panel = function(...) {
    panel.grid(h = -1, v = -1)
    panel.refline(h = 0, lwd = 3)
    panel.xyplot(..., type = "l")},
  auto.key = list(points = FALSE, lines = TRUE, columns = 2),
  par.settings = list(superpose.line = list(col = c("darkred", "darkblue"))))

two lines in lattice image

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