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.