2014-05-11 4 views
6

에 포함하십시오. 안녕하세요 여러분, 격자 그래프에서 작업하고 있지만 모두 잘 작동하지만 전설에 문제가 있습니다. 나는 xyplot()을 사용하고 있으며 정말 멋지다. enter image description here격자 레전드 플롯의 선과 점을 R

:

library(lattice) 
library(latticeExtra) 
parSettings <- list(layout.widths=list(left.padding=8,rigth.padding=20)) 
comma_formatter <- function (lim, logsc = FALSE, at = NULL, ...) { 
    ans <- yscale.components.default(lim = lim, logsc = logsc, at = at, ...) 
    xxPrime <- as.numeric(ans$left$labels$labels) 
    ans$left$labels$labels <- formatC(xxPrime, format = "fg", big.mark = ",") 
    ans 
} 

D <- xyplot(A2009+A2010+A2011+A2012+A2013+A2014 ~ factor(NM$AMes,unique(NM$AMes)), NM, type = c("p","l"), yscale.components = comma_formatter,auto.key=list(space="right",lines=TRUE,points=T), par.settings = parSettings,layout=c(1,1),aspect=0.6,main = "Delta Index",lwd=2,pch=16,cex.axis=4,scales=list(x=list(rot=90,font=2,cex=0.8),y=list(font=2),tick.number=9)) 
D 

결과는 다음 그래프는 다음과 같습니다

 AMes  A2009  A2010 A2011 A2012 A2013 A2014 
1  enero 710004.3 1458624.4 6229245 4407423 3006568 1749746 
2  febrero 889398.1 942099.6 5553163 4248144 2615730 1902865 
3  marzo 1114883.1 1210951.2 6372920 3537103 2833299 1605746 
4  abril 1419242.1 1151423.9 6755055 3500596 3438797 2116088 
5  mayo 1585857.2 1598355.1 7119008 4049074 3224926  NA 
6  junio 1010455.6 1370856.8 7585412 3279869 2794030  NA 
7  julio 1292333.4 1420547.4 7258676 3420974 3003458  NA 
8  agosto 1032443.3 2048291.1 7250944 2602310 2486932  NA 
9 septiembre 1133260.1 3043637.6 6227707 2225635 2515076  NA 
10 octubre 1229593.8 3669634.1 5795989 2853467 2674568  NA 
11 noviembre 1074569.6 3641665.2 4015226 2830482 1731063  NA 
12 diciembre 1370905.6 6780879.4 5391953 2823591 2054560  NA 

내가 다음 플롯을 생성하기 위해 다음 코드를 사용 : 내 dataframe는 NM (나는 마지막 부분에서 dput() 버전을 추가)입니다

이 줄거리의 중간 지점에있는 전설에 들어가기를 원합니다. 그러나 줄을 서서 볼 수있는 것처럼 분리되어 있지 않습니다. 또한 전설의 선과 점에 대해 그래프에서 사용한 것과 같은 스타일을 원합니다. 또한 최상위 x 축과 오른쪽 y 축을 제거 할 수 있는지 또는 적어도이 축에서 나누기를 제거 할 수 있는지 여부는 알 수 없습니다. 내 dataframe의 dput() 버전은 다음이다 : 당신의 도움에 대한

structure(list(AMes = c("enero", "febrero", "marzo", "abril", 
"mayo", "junio", "julio", "agosto", "septiembre", "octubre", 
"noviembre", "diciembre"), A2009 = c(710004.35, 889398.08, 1114883.11, 
1419242.11, 1585857.22, 1010455.56, 1292333.35, 1032443.35, 1133260.11, 
1229593.84, 1074569.64, 1370905.58), A2010 = c(1458624.41, 942099.6, 
1210951.2, 1151423.89, 1598355.1, 1370856.78, 1420547.36, 2048291.06, 
3043637.6, 3669634.09, 3641665.16, 6780879.37), A2011 = c(6229245.09, 
5553163.01, 6372919.9, 6755054.64, 7119008.27, 7585411.87, 7258675.63, 
7250944.21, 6227706.73, 5795989.01, 4015226.43, 5391952.87), 
    A2012 = c(4407422.89, 4248144.11, 3537103.4, 3500595.75, 
    4049074.18, 3279868.96, 3420974.23, 2602310.3, 2225635.25, 
    2853467.41, 2830482.27, 2823590.65), A2013 = c(3006568.05, 
    2615730, 2833299.1, 3438797.32, 3224926.48, 2794029.57, 3003458.16, 
    2486931.57, 2515076.46, 2674568.38, 1731063.04, 2054559.54 
    ), A2014 = c(1749745.71, 1902865, 1605746.41, 2116087.84, 
    NA, NA, NA, NA, NA, NA, NA, NA)), .Names = c("AMes", "A2009", 
"A2010", "A2011", "A2012", "A2013", "A2014"), row.names = c(NA, 
-12L), class = "data.frame") 

많은 감사합니다.

편집이 점은 전설의 내부 선이다이 스타일과 격자 전설을 얻을 수 있다면 나도 몰라

:

enter image description here

답변

2

나는 잠시 동안이 문제에 대해 생각을 해 봤는데을한다고 생각하지만 난 ' 너무 바빠서 지금까지 그 일을 할 시간이별로 없었어요. 나는 원래의 질문이 무엇인지 더 잘 이해합니다. 기본적으로 래티스는 범례의 줄 위에 점을 쌓는 것을 좋아하지 않습니다. 간단하게 쉽게 접근 할 수있는 옵션이 아닙니다. 그러나, grid (Lattice 패키지가 내장되어 있습니다)에 기꺼이 파묻혀 있다면, 무엇이든 할 수 있습니다. 그래서 나는 당신을 위해 일할 수있는 해결책을 함께 해킹했습니다. 당신은 전설의 값 중 하나가 열이있을 때

  • 이 현재 전략이 음모에 사용자 정의 전설 그리기 기능을 제공하는 것입니다 auto.key=(..., points=T, lines=T)

설정

  • 작동합니다. 나는 래티스 (Lattice)가 할 수있는만큼 많은 계산을 재사용하려고합니다.그리드 뷰포트를 가로 채고 선과 점을 병합하기 위해 몇 가지 변경 작업을 수행합니다. 여기에 사용자의 전설 그리기 기능이있다 :

    drawComboKey <- function(...) { 
        key = simpleKey(...) 
        key = draw.key(key, draw = FALSE) 
    
        ngroups <- (length(key$children)-1)/3 
        #remove points column 
        key$framevp$layout$ncol <- 
         key$framevp$layout$ncol-3L 
        key$framevp$layout$respect.mat <- 
         key$framevp$layout$respect.mat[,-(3:5)] 
        key$framevp$layout$widths <- 
         key$framevp$layout$widths[-(3:5)] 
    
        #adjust background 
        key$children[[1]]$col[2] <- 
         key$children[[1]]$col[2]-3L 
        key$children[[1]]$cellvp$layout.pos.col[2] <- 
         key$children[[1]]$cellvp$layout.pos.col[2]-3L 
        key$children[[1]]$cellvp$valid.pos.col[2] <- 
         key$children[[1]]$cellvp$valid.pos.col[2]-3L 
    
        #combine lines/points 
        mylines<-(2+ngroups*2):(1+ngroups*3) 
        for(i in mylines) { 
         key$children[[i]]$children <- 
          gList(key$children[[i-ngroups]]$children, key$children[[i]]$children) 
         key$children[[i]]$childrenOrder <- 
          names(key$children[[i]]$children) 
         key$children[[i]]$col <- key$children[[i]]$col-3L 
         key$children[[i]]$cellvp$layout.pos.col <- 
          key$children[[i]]$cellvp$layout.pos.col-3L 
         key$children[[i]]$cellvp$valid.pos.col <- 
          key$children[[i]]$cellvp$valid.pos.col-3L 
        } 
    
        key$childrenOrder<-names(key$children) 
        key 
    } 
    

    이 기능을 사용하려면 격자 객체를 가로 전설의 그리기 기능으로 이것을 설정해야합니다. 그래서, 그래서 당신은 내가 우리의 새로운 그리기 기능을 지정된 마지막 줄에 두 번째에서 볼 수있는 마지막

    library(lattice) 
    library(latticeExtra) 
    parSettings <- list(
        layout.widths=list(left.padding=8,rigth.padding=20), 
        superpose.line=list(lwd=2), 
        superpose.symbol=list(pch=16) 
    ) 
    comma_formatter <- function (lim, logsc = FALSE, at = NULL, ...) { 
        ans <- yscale.components.default(lim = lim, logsc = logsc, at = at, ...) 
        xxPrime <- as.numeric(ans$left$labels$labels) 
        ans$left$labels$labels <- formatC(xxPrime, format = "fg", big.mark = ",") 
        ans 
    } 
    
    D <- xyplot(A2009+A2010+A2011+A2012+A2013+A2014 ~ factor(NM$AMes,unique(NM$AMes)), NM, 
        type = c("p","l"), 
        yscale.components = comma_formatter, 
        auto.key=list(space="right", lines=TRUE,points=TRUE), 
        par.settings = parSettings,layout=c(1,1),aspect=0.6, 
        main = "Delta Index", 
        cex.axis=4, 
        scales=list(x=list(rot=90,font=2,cex=0.8),y=list(font=2),tick.number=9)) 
    D$legend$right$fun = "drawComboKey" 
    D; 
    

    의 코드로 시작. 그리고 그것은 꽤 많이 있습니다. 이 함수는 매우 허약하며 기본적으로 해킹입니다. 래티스 (Lattice)가 범례 또는 그와 유사한 것을 만드는 방법을 변경하기로 결정한 경우 사용자 자신의 위험 부담으로 사용하는 것이 항상 효과가 있다는 것을 보장 할 수는 없습니다. 그럼에도 불구하고 트 렐리 스 객체로 사용자 정의 할 수있는 것들의 좋은 예입니다.

    legend with overplotted points and lines

  • +0

    신난다 격자와 래티스에 대해 더 자세히 알아야합니다. 고마워요 @ MrFlick – Duck

    3

    은 넣어가 중앙에있는 범례 일 경우 space=을 사용하는 대신 auto.key 목록의 x=y= 요소를 설정해야합니다. 전달한 좌표는 0-1 배율로 0,0이 왼쪽 하단에 있습니다. 당신은 적당한 장소에서 그것을 얻을 때까지 숫자를 시험해야합니다.

    그리고 당신은 (결국 정말 지점입니다) 줄거리, 당신은 par.settings 매개 변수에 속성을 변경하고 xyplot

    에 직접 호출 lwd=pch=를 사용하지 않을해야 일치하도록 전설을 원하는 경우 나는이 트릭

    library(lattice) 
    library(latticeExtra) 
    parSettings <- list(
        layout.widths=list(left.padding=8,rigth.padding=20), 
        superpose.line=list(lwd=2), 
        superpose.symbol=list(pch=16) 
    ) 
    comma_formatter <- function (lim, logsc = FALSE, at = NULL, ...) { 
        ans <- yscale.components.default(lim = lim, logsc = logsc, at = at, ...) 
        xxPrime <- as.numeric(ans$left$labels$labels) 
        ans$left$labels$labels <- formatC(xxPrime, format = "fg", big.mark = ",") 
        ans 
    } 
    
    D <- xyplot(A2009+A2010+A2011+A2012+A2013+A2014 ~ factor(NM$AMes,unique(NM$AMes)), NM, 
        type = c("p","l"), 
        yscale.components = comma_formatter, 
        auto.key=list(x=.35,y=.82, lines=TRUE,points=T), 
        par.settings = parSettings,layout=c(1,1),aspect=0.6, 
        main = "Delta Index", 
        cex.axis=4, 
        scales=list(x=list(rot=90,font=2,cex=0.8),y=list(font=2),tick.number=9)) 
    D; 
    

    updated plot

    +1

    '내가 할 수 있다면 당신에게'superpose.symbol = 목록 (PCH = 16)에 대한 또 다른 하나를 줄 것입니다. –

    +0

    친애하는 @MrFlick 도움을 주셔서 감사합니다.하지만 전설의 중간에 포인트를 넣고 싶습니다. 플롯 중간에는 아닙니다. 어쩌면 가능할 수도 있습니다. – Duck

    +0

    전설에서 점과 선 두 가지를 구분하는 것이 환상적 일 것입니다. – Duck

    3

    가 또는 당신은 단지 키의 일부 설정을 조정할 수 있습니다 :

    그리고 여기가 결과입니다.

    기본적으로 키 라인 인수에 유형 = "B"를 설정하여, 당신은 쉽게 단 하나의 지점에 얻는 방법을 알아 내기 위해 내가 시도하지 않은

    # Your code from above 
    parSettings <- list(layout.widths=list(left.padding=8,rigth.padding=20)) 
    comma_formatter <- function (lim, logsc = FALSE, at = NULL, ...) { 
    ans <- yscale.components.default(lim = lim, logsc = logsc, at = at, ...) 
    xxPrime <- as.numeric(ans$left$labels$labels) 
    ans$left$labels$labels <- formatC(xxPrime, format = "fg", big.mark = ",") 
    ans 
    } 
    
    
    # create your lattice plot 
    xyplot(A2009+A2010+A2011+A2012+A2013+A2014 ~ factor(NM$AMes,unique(NM$AMes)), NM, 
        type = "b",par.settings = parSettings,layout=c(1,1), 
        aspect=0.6,main = "Delta Index",lwd=2, 
        pch=16,cex.axis=4, 
        scales=list(x=list(rot=90,font=2,cex=0.8), 
           y=list(font=2),tick.number=9,tck=c(1,0)), 
    
        # add a legend using key 
    
        key=list(space="right", 
          text=list(paste("A",2009:2014,sep="")), 
          lines=list(pch=19,type="b", 
             col=trellis.par.get()$superpose.symbol$col[1:6]))) 
    

    라인 내부에 포인트를 추가 할 수 있습니다 3 대신에 열쇠에있는 선, 그러나 일을한다. 짜증나는 부분은 색상을 수동으로 지정하는 것이지만 트 렐리 스 설정에서 색상의 레벨 수를 직접 가져 오는 방법이 있습니다.

    희망이 도움이됩니다.

    Example of lattice key with superposed lines and points

    관련 문제