2016-07-01 22 views
1

Ich möchte eine zweite Y-Achse (rechts) und eine zweite X-Achse (oben) zum folgenden (Gitter) Levelplot hinzufügen. Diese Achsen sollten nur bestimmte Zeilen und Spalten (keine Beschriftungen) anzeigen und somit die Teppichfunktion der Basisgrafik nachahmen. Wie kann das gemacht werden?Gitterplot mit einer zweiten x- und einer zweiten y-Achse?

library(lattice) 
library(latticeExtra) 

## Generate a correlation matrix 
d <- 50 
L <- diag(1:d) 
set.seed(271) 
L[lower.tri(L)] <- runif(choose(d,2)) 
Sigma <- L %*% t(L) 
P <- cor(Sigma) 

## Panel function 
my_panel <- function(...) { 
    panel.levelplot(...) 
    panel.abline(h = (1:4)*10, v = (1:4)*10, lty = 2) 
    panel.axis(side = "top", at = (1:50)-0.5, draw.labels = FALSE) # maybe a panel axis could do it? why not centered? 
} 

## Plot 
obj1 <- levelplot(P, xlab = "Column", ylab = "Row", 
        col.regions = grey(c(seq(1, 0, length.out = 600))), 
        panel = my_panel) 
obj2 <- xyplot(NA~NA, ylim = c(0, 50), 
       scales = list(x = list(at = (1:50)-0.5, labels = rep("", 50)), 
          y = list(at = (1:50)-0.5, labels = rep("", 50)))) 
doubleYScale(obj1, obj2, use.style = FALSE) # idea based on latticeExtra; only gives a 2nd y-axis, though 
+1

Können Sie machen es klar, was der gewünschte Ausgang? Vielleicht erstellen Sie eine Skizze, um zu zeigen, was Sie erstellen möchten? Sollen die zweiten Achsen unterschiedliche Maßstäbe haben? Versuchst du nur Dinge zu beschriften? – MrFlick

+0

Ich versuche, bestimmte Zeilen und Spalten in Blockmatrizen anzugeben, wenn Korrelationsmatrizen gezeichnet werden. Die Blöcke entsprechen Branchen und Teilsektoren der Daten. Der obige Ansatz über panel.abline() funktioniert gut für Sektoren, aber die Subsektoren sind einfach zu viele. Ähnlich wie teppich(), möchte ich die Zeilen und Spalten der Subsektoren außen oben und rechts (2nd Achsen) angeben. –

+1

BTW, es gibt eine 'panel.rug', aber es zeigt nicht die Teppiche auf der Außenseite der Plot-Region. –

Antwort

2

Sie waren auf eine gute Idee, mit panel.rug(), wurden aber von Gitter ‚s Standard-Clipping seiner Plotten auf das Innere der Platte behindert. Um das zu umgehen, können Sie das Clipping über das Argument par.settings= ausschalten. Wenn Sie das Zeichnen von Standard-Achsen-Tick-Markierungen auf den rechten und oberen Panel-Grenzen unterdrücken möchten, können Sie dies mit dem Argument tck= tun, wie unten gezeigt.

my_panel <- function(...) { 
    panel.levelplot(...) 
    panel.abline(h = (1:4)*10, v = (1:4)*10, lty = 2) 
    ## Have panel.rug print tick marks starting at 1 npc (edge of panel) 
    ## and extending to 1.02 npc (slightly outside of panel). (See ?unit) 
    panel.rug(x = (1:51)-0.5, y = (1:51)-0.5, 
       start = 1, end = 1.02, 
       col="black") 
} 

levelplot(P, xlab = "Column", ylab = "Row", 
      col.regions = grey(c(seq(1, 0, length.out = 600))), 
      ## Suppress default scales on right and top sides, by setting their 
      ## tick lengths to zero 
      scales = list(tck=c(1,0)), 
      ## Turn off clipping, so that panel.rug can plot outside of the panel 
      par.settings = list(clip = list(panel = "off")),   
      panel = my_panel) 

enter image description here