IT

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

lottoking 2020. 3. 20. 08:31
반응형

동일한 그래프에서 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)
  )

?를 사용하여 x 축에서 시계열 var0var1동일한 그래프에 어떻게 플롯 할 수 있습니까? 보너스 포인트는 당신이 만드는 경우 다른 색상 및 전설을 포함 할 수 있습니다!dateggplot2var0var1

나는 이것이 매우 간단하다고 확신하지만 거기에서 어떤 예도 찾을 수 없습니다.


적은 수의 변수의 경우 수동으로 플롯을 작성할 수 있습니다.

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("reshape2")
library("ggplot2")

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

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

ggplot2 출력


ggplot2의 경우 데이터가 "wide"대신 "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()

여러 시리즈 ggplot2

그것을 통해 배관 한 후 소비되는 data것을 명확히하기 위해 다음과 같습니다.ggplotgather

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

데이터 사용 :

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()reshapereshape2당신이 조작 할 수있는 더 복잡한 실제 데이터 세트가있는 경우 유용 할 수 있습니다.

데이터가이 누적 된 형태가되면 ggplot()모든 추가 기능을 사용하여 원하는 플롯을 생성하기 위해 간단한 호출 만하면 됩니다 (한 가지 이유로 상위 레벨의 플롯 패키지 가 유용하고 유용한 이유는 다음 latticeggplot2같습니다).

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

축 레이블, 범례 제목 등을 정리하기 위해 남겨 두겠습니다.

HTH


나는 또한 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')

여기에 이미지 설명을 입력하십시오

그러나이 형식을 사용하여 올바른 범례를 추가 할 수 없었습니다. 아무도 방법을 알고 있습니까?


@Papalagui는 전설의 일부가되기 위해 색상이 aes에 있어야합니다. 이처럼 :

geom_line(aes(x=date,y=var0,color='red'))

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

반응형