문제

Monte-Carlo 시뮬레이션을 실행하고 있으며 출력이 양식입니다.

> d = data.frame(iter=seq(1, 2), k1 = c(0.2, 0.6), k2=c(0.3, 0.4))
> d
iter  k1   k2
1     0.2  0.3
2     0.6  0.4

내가 생성하고 싶은 음모는 다음과 같습니다.

plot(d$iter, d$k1)
plot(density(d$k1))

GGPLOT2를 사용하여 동등한 플롯을 수행하는 방법을 알고 있습니다.

new_d = data.frame(iter=rep(d$iter, 2), 
                   k = c(d$k1, d$k2), 
                   label = rep(c('k1', 'k2'), each=2))

그런 다음 플로팅이 쉽습니다. 그러나 반복 횟수는 매우 클 수 있으며 K의 수도 클 수 있습니다. 이것은 매우 큰 데이터 프레임으로 엉망이되는 것을 의미합니다.

어쨌든이 새로운 데이터 프레임을 작성하지 않아도 되나요?

감사

도움이 되었습니까?

해결책

짧은 대답은 "아니오"입니다. 데이터 프레임 생성을 피할 수는 없습니다. ggplot 데이터가 데이터 프레임에 있어야합니다. 사용하는 경우 qplot, 당신은 x와 y에 대해 별도의 벡터를 줄 수 있지만 내부적으로 전달한 매개 변수에서 데이터 프레임을 만들고 있습니다.

나는 Juba의 제안에 동의합니다 - 사용법을 배우십시오. reshape 기능, 또는 더 나은 reshape 패키지 melt/cast 기능. 긴 형식으로 데이터를 넣는 데 빠르면 놀라운 일을 만듭니다. ggplot 그래프가 한 걸음 더 가까워집니다!

다른 팁

예, 데이터 프레임 생성을 피할 수 있습니다. 기본 계층에 빈 인수 목록을 제공하십시오. ggplot(). 다음은 코드를 기반으로 한 완전한 예입니다.

도서관 (GGPLOT2)

d = data.frame(iter=seq(1, 2), k1 = c(0.2, 0.6), k2=c(0.3, 0.4))
# desired plots:
# plot(d$iter, d$k1)
# plot(density(d$k1))

ggplot() + geom_point(aes(x = d$iter, y = d$k1))
# there is not enough data for a good density plot,
# but this is how you would do it:
ggplot() + geom_density(aes(d$k1))

이것은 허용하지만 데이터 프레임을 만들지 않으면 데이터 프레임이 여전히 내부적으로 생성 될 수 있습니다. 예를 들어, 다음 추출물을 참조하십시오 ?geom_point:

데이터 프레임을 생성하기 위해 모든 객체가 강화됩니다.

당신은 사용할 수 있습니다 reshape 기능 데이터 프레임을 "긴"형식으로 변환 할 수 있습니다. 코드보다 조금 더 빠를 수 있습니까?

R> reshape(d, direction="long",varying=list(c("k1","k2")),v.names="k",times=c("k1","k2"))
     iter time   k id
1.k1    1   k1 0.2  1
2.k1    2   k1 0.6  2
1.k2    1   k2 0.3  1
2.k2    2   k2 0.4  2

따라서 이전 답변에 추가하기 만하면됩니다. qplot을 사용하면 할 수 있습니다

p <- qplot(y=d$k2, x=d$k1)

그리고 거기에서 더 구축, 예를 들어

p + theme_bw()

그러나 동의합니다 - Melt/Cast는 생성 된 길입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top