2014-05-11 16 views
6

Hallo allerseits Ich arbeite in einem Gitter-Diagramm und alles funktioniert gut, aber ich habe einige Probleme mit der Legende. Ich benutze xyplot() und es funktioniert super. Mein Datenrahmen ist NM (I dput() Version im letzten Teil hinzugefügt werden):Fügen Sie Linien und Punkte in Gitter-Legenden-Plot in R

 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 

ich den nächsten Code verwendet, um das nächste Grundstück zu produzieren:

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 

Das Ergebnis ist die nächste Grafik: enter image description here

Ich möchte in der Legende dieser Handlung Punkte in der Mitte der Linien bekommen, aber nicht getrennt, wie yiu sehen kann. Auch möchte ich den gleichen Stil, den ich in der Grafik für Linien und Punkte in der Legende verwendet habe, erhalten. Ich weiß auch nicht, ob es möglich ist, die obere X-Achse und die rechte Y-Achse zu entfernen oder zumindest die Unterbrechungen in dieser Achse zu entfernen. Die dput() Version meines Datenrahmen ist die nächste:

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") 

Vielen Dank für Ihre Hilfe.

EDIT

Ich weiß nicht, ob es möglich ist, mit diesem Stil eine Legende in Gitter zu bekommen, wo Punkte innerhalb Linien in der Legende sind:

enter image description here

Antwort

2

ich habe eine Zeit lang über dieses Problem nachgedacht, aber ich Ich war sehr beschäftigt, also hatte ich bis jetzt nicht viel Zeit, daran zu arbeiten. Ich verstehe besser, was deine ursprüngliche Frage war. Standardmäßig stapelt Lattice nicht die Punkte über den Linien in der Legende. Das ist einfach keine leicht zugängliche Option. Allerdings, wenn Sie bereit sind, graben in grid (das Paket Lattice ist gebaut) Sie können so ziemlich alles tun. Also habe ich eine Lösung zusammengehackt, von der ich denke, dass sie für dich arbeiten kann. Dies sollte funktionieren, wenn

  • Sie nur eine Spalte von Werten in der Legende hat
  • Sie setzen auto.key=(..., points=T, lines=T)

Die Strategie hier ist eine individuelle Legende Zeichenfunktion auf das Grundstück zu liefern. Ich versuche so viele Berechnungen wie möglich von Lattice zu verwenden.Ich nehme das Rasterfenster ab und führe einige Änderungen durch, um die Linien und Punkte zusammenzuführen. Hier ist die maßgeschneiderte Legende Zeichenfunktion:

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 
} 

diese Funktion nutzen zu können, müssen Sie das Spalier Objekt abfangen und setzen diese als Zeichenfunktion für die Legende. So, beginnend mit dem Code vom letzten Mal

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; 

So kann man in der zweiten bis zur letzten Zeile sehe ich unsere neue Zeichenfunktion angegeben. Und das ist es ziemlich. Diese Funktion ist ziemlich zerbrechlich und im Grunde genommen ein Hack. Ich kann nicht garantieren, dass es immer funktionieren wird, wenn Lattice entscheidet, wie es Legenden oder ähnliches baut, also auf eigenes Risiko. Dennoch ist es ein ziemlich gutes Beispiel für die Art von Dingen, die Sie mit Trellis-Objekten tun können, um sie anzupassen.

Und hier ist das Ergebnis:

legend with overplotted points and lines

+0

Ehrfürchtig muss ich mehr über Gitter und Lattice erfahren. Danke Meister @MrFlick – Duck

3

zu setzen die Legende in der Mitte, müssen Sie die x= und y= Elemente der auto.key Liste statt space=. Die Koordinaten, die Sie passieren, befinden sich auf der 0-1-Skala, wobei 0,0 die untere links ist. Sie müssen einige Zahlen ausprobieren, bis Sie es an der richtigen Stelle haben.

Und wenn Sie die Legende will die Handlung passen (die immerhin wirklich der Punkt ist), sollten Sie die Eigenschaften in der par.settings Parameter werden verändert und nicht mit lwd= und pch= direkt im Aufruf von xyplot

ich glaube, das den Trick tun sollte

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

Ich würde Ihnen ein anderes +1 für 'superpose.symbol = list (pch = 16)', wenn ich könnte. –

+0

Danke für deine Hilfe, lieber @MrFlick, aber ich möchte die Punkte in der Mitte der Zeilen in der Legende und nicht in der Mitte der Handlung setzen. Vielleicht ist es möglich. – Duck

+0

Es wäre fantastisch, in der Legende Punkt und Linie zu haben und nicht diese zwei Elemente getrennt. – Duck

3

Alternativ können Sie nur einige Einstellungen in Schlüssel anpassen.

Grundsätzlich durch type = „b“ in der Linien Argument Schlüssel einstellen, können Sie einfach Punkte innerhalb der Linien hinzufügen

# 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]))) 

ich nicht, um herauszufinden, haben versucht, wie sich nur auf einen einzigen Punkt auf die Zeilen in der Taste statt 3, aber es macht den Job. Der nervige Teil besteht darin, die Farben manuell festzulegen, aber ich bin sicher, dass es eine Möglichkeit gibt, die Anzahl der Ebenen für Ihre Farben direkt aus den Trellis-Einstellungen zu importieren.

Hoffe, dass dies hilft.

Example of lattice key with superposed lines and points

Verwandte Themen