programing

동일한 그래프에서 ggplot2를 사용하여 두 변수를 선으로 표시

newstyles 2023. 6. 28. 21:24

동일한 그래프에서 ggplot2를 사용하여 두 변수를 선으로 표시

아주 새로운 질문입니다만, 제가 이런 데이터를 가지고 있다고 합시다.

test_data <-
  data.frame(
    var0 = 100 + c(0, cumsum(runif(49, -20, 20))),
    var1 = 150 + c(0, cumsum(runif(49, -10, 10))),
    date = seq(as.Date("2002-01-01"), by="1 month", length.out=100)
  )

두 시계열을 모두 표시하려면 어떻게 해야 합니까?var0그리고.var1동일한 그래프에서.dateX축에서, 사용ggplot2보너스 점수를 매길 경우var0그리고.var1다양한 색상, 그리고 전설을 포함할 수 있습니다!

저는 이것이 매우 간단하다고 확신하지만, 저는 어떤 예도 찾을 수 없습니다.

적은 수의 변수의 경우 직접 그림을 작성할 수 있습니다.

ggplot(test_data, aes(date)) + 
  geom_line(aes(y = var0, colour = "var0")) + 
  geom_line(aes(y = var1, colour = "var1"))

일반적인 접근 방식은 데이터를 긴 형식으로 변환하는 것입니다(사용).melt()포장에서.reshape또는reshape2) 또는gather()/pivot_longer()에서tidyr패키지:

library("ggplot2")
library("tidyr")
library("reshape2")

## convert to long format with tidyr::pivot_longer
test_data_long_tidyr <- pivot_longer(test_data, cols = starts_with("var"))

ggplot(data=test_data_long_tidyr,
       aes(x=date, y=value, colour=name)) +
  geom_line() ## output not shown, it's equivalent to the below graph (with a tiny difference in the legend title)

## convert to long format with reshape2::melt
test_data_long <- melt(test_data, id="date")  

ggplot(data=test_data_long,
       aes(x=date, y=value, colour=variable)) +
  geom_line()

또한 데이터를 폭에서 길이로 재구성하는 방법에 대한 이 질문을 참조하십시오.

ggplot2의 경우 데이터가 "넓음"이 아닌 "높이" 형식이어야 합니다."광범위"는 각 변수를 다른 열로 하여 행당 관측치를 갖는 것을 의미합니다(지금처럼).변수의 이름을 알려주는 열과 변수의 값을 알려주는 다른 열이 있는 "tall" 형식으로 변환해야 합니다.너비에서 높이로 넘어가는 과정을 보통 "용융"이라고 합니다.사용할 수 있습니다.tidyr::gather데이터 프레임을 녹이는 방법:

library(ggplot2)
library(tidyr)

test_data <-
  data.frame(
    var0 = 100 + c(0, cumsum(runif(49, -20, 20))),
    var1 = 150 + c(0, cumsum(runif(49, -10, 10))),
    date = seq(as.Date("2002-01-01"), by="1 month", length.out=100)
  )
test_data %>%
    gather(key,value, var0, var1) %>%
    ggplot(aes(x=date, y=value, colour=key)) +
    geom_line()

multiple series ggplot2

확실히 하기 위해서입니다.data그거ggplot파이프로 연결한 후 소비합니다.gather다음과 같이 표시됩니다.

date        key     value
2002-01-01  var0    100.00000
2002-02-01  var0    115.16388 
...
2007-11-01  var1    114.86302
2007-12-01  var1    119.30996

저도 R은 처음이지만 ggplot이 어떻게 작동하는지 이해하려고 노력하고 있습니다.저는 단지 완벽한 솔루션이 아니라 몇 가지 다른 관점을 추가하기 위해 공유할 뿐입니다.

ggplot이 데이터 프레임과 더 잘 작동하도록 만들어졌다는 것은 알고 있지만 데이터 프레임을 사용하지 않고 두 벡터를 직접 플롯할 수 있다는 것을 아는 것도 가끔 유용할 수 있습니다.

데이터를 로드하는 중입니다.원래 날짜 벡터 길이는 100인 반면 var0과 var1의 길이는 50이므로 사용 가능한 데이터(처음 50일)만 플롯합니다.

var0 <- 100 + c(0, cumsum(runif(49, -20, 20)))
var1 <- 150 + c(0, cumsum(runif(49, -10, 10)))
date <- seq(as.Date("2002-01-01"), by="1 month", length.out=50)    

플롯

ggplot() + geom_line(aes(x=date,y=var0),color='red') + 
           geom_line(aes(x=date,y=var1),color='blue') + 
           ylab('Values')+xlab('date')

enter image description here

그러나 이 형식을 사용하여 올바른 범례를 추가할 수 없었습니다.방법 아는 사람?

데이터 사용:

test_data <- data.frame(
var0 = 100 + c(0, cumsum(runif(49, -20, 20))),
var1 = 150 + c(0, cumsum(runif(49, -10, 10))),
Dates = seq.Date(as.Date("2002-01-01"), by="1 month", length.out=100))

나는 스택 버전을 만듭니다. 그것은 무엇입니까?ggplot()다음과 관련된 작업을 수행할 수 있습니다.

stacked <- with(test_data,
                data.frame(value = c(var0, var1),
                           variable = factor(rep(c("Var0","Var1"),
                                                 each = NROW(test_data))),
                           Dates = rep(Dates, 2)))

이 경우 생산은stacked우리는 몇 가지 조작만 하면 되었기 때문에 꽤 쉬웠지만,reshape()그리고reshape그리고.reshape2조작할 보다 복잡한 실제 데이터 세트가 있는 경우 유용할 수 있습니다.

데이터가 이렇게 쌓인 형태가 되면 단순한 데이터만 있으면 됩니다.ggplot()합니다.lattice그리고.ggplot2매우 유용함):

require(ggplot2)
p <- ggplot(stacked, aes(Dates, value, colour = variable))
p + geom_line()

축 레이블, 범례 제목 등을 정리하는 일은 당신에게 맡기겠습니다.

HTH

언급URL : https://stackoverflow.com/questions/3777174/plotting-two-variables-as-lines-using-ggplot2-on-the-same-graph