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


305

아주 새로운 질문이지만 다음과 같은 데이터가 있다고 가정하십시오.

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

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

답변:


373

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

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

3
좋은 예, 그러나 내 자신의 색상 (예 : 검은 색과 주황색)을 사용자 정의하는 방법은 무엇입니까? colour=변수 변수로 사용 하고있는 것 같습니다 .
Darwin PC

1
colour='var_names'hadley가 지정한대로 도 잘 작동합니다. 그러나 @DaveX-함수에 의해 자동으로 선택된 색상 대신 특정 색상을 선택하려는 경우 더 구체적입니다.
I_m_LeMarque

범례를 어떻게 추가 할 수 있습니까?
user1700890

361

일반적인 접근 방식은 데이터를 긴 형식 ( 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 출력

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


8
패키지 gather()기능을 사용하여 tidyr데이터를 녹일 수도 있습니다.gather(test_data, variable, value, -date)
janosdivenyi

33

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

13

데이터 사용 :

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()당신이 모든 엑스트라와 함께 원하는 플롯 (이유 중 하나를 생산하기 위해 전화를 왜 높은 수준과 같은 패키지를하려 lattice하고ggplot2 매우 유용합니다)

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

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

HTH


1
나는 당신이 거기에 당신의 코드에서 잘못 배치 된 Parens가 있다고 생각합니다. 나는 이것이 당신이 가진 것이라고 생각합니다 : stacked <-with (test_data, data.frame (value = c (var0, var1), variable = factor (rep (c ( "Var0", "Var1"))), 각각 = NROW (test_data), 날짜 = rep (date, 2))). 또한 "각"열의 목적은 무엇입니까? 그리고 이것은 rcs에 의해 표시된 것처럼 데이터를 녹이는보다 복잡하고 덜 효율적인 방법입니까? 용융이 작업을 수행하지 못하는 인스턴스를 상상할 수 있지만 뭔가 빠진 경우가 아니라면이 작업에 가장 적합한 도구입니까?
체이스

1
@chase, 죄송합니다. Emacs ESS에 들여 쓰기가 잘못되었습니다. 각각에 대한 논쟁 rep()이므로 우리는 실제로 3 열만 받고 stacked있습니다. 들여 쓰기를 더 명확하게하기 위해 코드를 편집하겠습니다.
개빈 심슨

1
@추적; 귀하의 의견 melt()이 잘 작성되었으며, 여기서 reshape [2] 패키지가 유용 할 것입니다. 나는 reshape2에 익숙하지 않으며 손으로 직접 수행하는 간단한 조작이 호출보다 더 복잡하므로 melt()사용 방법을 읽을 필요가 없으므로 노력이 적습니다 melt(). rcs는 내가 대답하는 동안 그의 대답으로 몰래 들어갔습니다. 답장을 시작할 때 답이 없었습니다. 그들이 말하는 것처럼 고양이를 껍질을 벗기는 여러 가지 방법! ;-)
개빈 심슨

7

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

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

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


1
이것은 전설을 추가합니다 ggplot() + geom_line(aes(x=date,y=var0, group=1, colour = 'red')) + geom_line(aes(x=date,y=var1, group = 2, colour = 'blue')) + ylab('Values')+xlab('date')
flurbius
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.