x 스케일은 같지만 R에서는 다른 y 스케일로 두 개의 그래프를 세로로 쌓는 방법은 무엇입니까?


9

인사말,

현재 R에서 다음을 수행하고 있습니다.

require(zoo)
data <- read.csv(file="summary.csv",sep=",",head=TRUE)
cum  = zoo(data$dcomp, as.Date(data$date))
data = zoo(data$compressed, as.Date(data$date))
data <- aggregate(data, identity, tail, 1)
cum  <- aggregate(cum, identity, sum, 1)
days = seq(start(data), end(data), "day")
data2 = na.locf(merge(data, zoo(,days)))

plot(data2,xlab='',ylab='compressed bytes',col=rgb(0.18,0.34,0.55))
lines(cum,type="h",col=rgb(0,0.5,0))

summary.csv의 조각 :

date,revision,file,lines,nclass,nattr,nrel,bytes,compressed,diff,dcomp
2007-07-25,16,model.xml,96,11,22,5,4035,991,0,0
2007-07-27,17,model.xml,115,16,26,6,4740,1056,53,777
2007-08-09,18,model.xml,106,16,26,7,4966,1136,47,761
2007-08-10,19,model.xml,106,16,26,7,4968,1150,4,202
2007-09-06,81,model.xml,111,16,26,7,5110,1167,13,258
...

마지막 두 줄은 필요한 정보를 표시하며 결과는 다음과 비슷합니다. 대체 텍스트 파란색 선은 관심있는 아티팩트의 바이트 단위 엔트로피입니다. 녹색 선은 변화의 엔트로피를 나타냅니다.

자,이 그래프에서는 스케일에 큰 차이가 없기 때문에 잘 작동합니다. 그러나 녹색 선이 너무 작아서 볼 수없는 다른 그래프가 있습니다.

내가 찾던 솔루션에는 두 가지가 관련되었습니다.

  1. 녹색 세로선을 첫 번째 그래프 바로 아래의 자체 y 축을 사용하지만 x 축은 공유하는 두 번째 그래프로 이동합니다.
  2. 특정 값보다 "크기"에 더 관심이 있기 때문에 로그 스케일을 제공합니다.

미리 감사드립니다!

추신 누군가가 몇 달을 언급하는 x 스케일에 "경미한 진드기"를 넣을 수있는 방법을 말해 줄 수 있다면 고맙습니다.

답변:


15

par(new=TRUE)서로 다른 두 개의 y 축을 사용하여 동일한 그래프로 플롯 할 수 있습니다 ! 또한 문제를 해결해야합니다.

다음으로 동일한 플롯에서 두 개의 랜덤 정규 변수, 하나는 평균 0에 다른 하나는 평균 100 ( sd s = 1)에 플로팅하는 간단한 예를 찾을 수 있습니다. 첫 번째 것은 왼쪽 y 축에서 빨간색, 두 번째는 오른쪽 y 축에서 파란색입니다. 그런 다음 축 레이블이 추가됩니다.

여기 있습니다 :

x <- 1:10
y1 <- rnorm(10)
y2 <- rnorm(10)+100

plot(x,y1,pch=0,type="b",col="red",yaxt="n",ylim=c(-8,2))
par(new=TRUE)
plot(x,y2,pch=1,type="b",col="blue",yaxt="n",ylim=c(98,105))

axis(side=2)
axis(side=4)

다음과 같이 보입니다 (왼쪽 축에는 빨간색, 오른쪽 축에는 파란색을 기억하십시오). 대체 텍스트

업데이트 :
의견을 바탕으로 업데이트 된 버전의 그래프를 생성했습니다. 이제 그래프 par(mar=c(a,b,c,d))주위에 더 큰 마진을 생성하고 (오른쪽 축 레이블에 필요함) 축 레이블 mtext을 표시하고 axis함수의 고급 사용법을 사용하여 기본 그래프 기능에 대해 좀 더 깊이 파고 들었습니다 .

x <- 1:100
y1 <- rnorm(100)
y2 <- rnorm(100)+100

par(mar=c(5,5,5,5))

plot(x,y1,pch=0,type="b",col="red",yaxt="n",ylim=c(-8,2),ylab="")
axis(side=2, at=c(-2,0,2))
mtext("red line", side = 2, line=2.5, at=0)

par(new=TRUE)
plot(x,y2,pch=1,type="b",col="blue",yaxt="n",ylim=c(98,108), ylab="")
axis(side=4, at=c(98,100,102), labels=c("98%","100%","102%"))
mtext("blue line", side=4, line=2.5, at=100)

대체 텍스트

보시다시피 꽤 간단합니다. 함수 ylim에서 데이터의 위치를 ​​정의한 plot다음 함수에서 원하는 축 틱을 선택 at하여 사용할 axis수 있습니다. 또한, 당신도를 통해 (공칭 x 축에 대한 매우 유용) 축 틱에 대한 레이블을 제공 할 수 labels에서 axis(오른쪽 축 여기에 수행) 기능. 축 레이블을 추가하려면와 mtext함께 at수직 위치를 지정하십시오 ( line가로 위치 지정).

있는지 확인하는 확인 ?plot, ?par, ?axis, 및 ?mtext추가 정보를 원하시면.
훌륭한 웹 리소스는 다음과 같습니다 빠른-R : 그래프에 대한 1 , 2 , 및 3 .


흥미롭지 만 독자들에게 어느 스케일이 어느 라인에 해당하는지 어떻게 알 수 있습니까?
Hugo Sereno Ferreira

이 그래프를 살펴보십시오 : imgur.com/K8BCr.png 여기에는 y 축 레이블과 틱이 데이터에 적용되는 위치 (예 : 그래프 상단의 왼쪽 축에 해당하는 데이터) 만 표시됩니다. 그래프 하단의 오른쪽 축에 해당하는 데이터). 또한 위의 예와 같이 다른 색상과 선 종류를 사용하여 캡션에서 설명했습니다. 왼쪽의 꺾은 선형 차트와 오른쪽 축의 꺾은 선형 차트를 사용하여 구분을 더 명확하게 할 수도 있습니다.
Henrik

당신이 제시 한 예는 매우 훌륭합니다 ... 어떻게 각 축을 수직으로 오프셋 관리 했습니까?
Hugo Sereno Ferreira

2
정말 좋은 예입니다. 그래프의 유일한 문제는 두 Y 변수 이름이 겹치는 것입니다. 이 경우 왼쪽과 오른쪽 중 하나를 원할 것입니다 (수직 위치에서도 가능). 예제를 "정말 양호"에서 "완벽"으로 업그레이드하려면 R의 mtext 함수를 사용하여 변수 이름을 사용하고 싶을 수 있습니다.
Dave Kellen

@Hugo @Dave : 두 의견의 통합에 대한 내 업데이트를 참조하십시오.
Henrik

12

나는 당신이 원하는 것을 얻을 수 있다고 생각합니다 ggplot2. 아래 코드를 사용하여 다음을 생성 할 수 있습니다.

대체 텍스트

분명히 선 색상과 같은 것을 원하는대로 변경할 수 있습니다. x 축에서는 몇 년 동안 주요 라인을 지정하고 몇 달 동안 작은 라인을 지정했습니다.

require(ggplot2)
t = as.Date(0:1000, origin="2008-01-01")  
y1 = rexp(1001)
y2 = cumsum(y1)
df = data.frame(t=t, values=c(y2,y1), type=rep(c("Bytes", "Changes"), each=1001))

g = ggplot(data=df, aes(x=t, y=values)) +
  geom_line() +
  facet_grid(type ~ ., scales="free") +
  scale_y_continuous(trans="log10") +
  scale_x_date(major="years", minor="months") +
  ylab("Log values")
g

어, 나는 df = data.frame (t = days, values ​​= c (data2, cum), type = rep (c ( "Bytes", "Changes"), each = 1001)) 설정을 시도했지만 rbind.zoo (...) 오류 : 인덱스 중복
Hugo Sereno Ferreira

data2와 cum이 동물원 개체이기 때문입니다. 원시 값을 얻으려면 as.vector (data2)를 사용하십시오. 또한 1001 개의 관측치가 있으므로 1001을 사용했습니다. 다른 것이 필요합니다.
csgillespie

Noob R 사용자 : data.frame (t = days, values ​​= c (as.vector (data2), as.vector (cum))) 오류 : 인수가 다른 행 수를 암시 함 : 1063, 1300, 2
Hugo Sereno Ferreira

데이터를 보려면 "days", "data2"및 "cum"을 입력하십시오. 그런 다음 "길이 (일)"등을보십시오. 시점과 값을 일치시켜야합니다.
csgillespie
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.