동일한 그래프에서 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 축에서 시계열 var0
과 var1
동일한 그래프에 어떻게 플롯 할 수 있습니까? 보너스 포인트는 당신이 만드는 경우 와 다른 색상 및 전설을 포함 할 수 있습니다!date
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("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의 경우 데이터가 "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()
그것을 통해 배관 한 후 소비되는 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
데이터 사용 :
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
나는 또한 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'))
'IT' 카테고리의 다른 글
Java에서 쌍 또는 2 개의 튜플 사용 (0) | 2020.03.20 |
---|---|
JavaScript 함수가 정의되어 있는지 확인하는 방법 (0) | 2020.03.20 |
Gson : String을 JsonObject로 직접 변환 (POJO 없음) (0) | 2020.03.20 |
HTML5 양식 필수 속성 (0) | 2020.03.20 |
브라우저에서 Jupyter / ipython 노트북의 셀 너비를 늘리려면 어떻게합니까? (0) | 2020.03.20 |