2012-10-15 13 views
9

Jak mogę iść o usunięcie pola wokół xyplot, zachowując oś znaków podziałki skali? W duchu minimalistycznym danych graficznej estetyki Edwarda Tuft za te linie osi są „atrament nie dane”, a może (powinien?) Być „usunięte”.Sterowanie kleszcze osi i linii osi oddzielnie na R siatkowej xyplot

library(lattice) 
my.df <- data.frame(x=-10:10) 
my.df$y <- my.df$x^2 
xyplot(y~x,data=my.df) 

standard xyplot output

Wydaje się, że parametry wyświetlacza krata (np axis.line$col) sterują zarówno linii i oś kleszczy wraz:

xyplot(y~x,data=my.df, 
     par.settings=list(axis.line=list(col="transparent"))) 

with axis.line$col="transparent"

... co jest nie jest to pożądany wynik, więc nie wygląda na to, że istnieje prosty sposób, aby wyłączyć linie, opuszczając skrzynkę.

Najlepszą udało mi się wymyślić jest hack brute-force, gdzie budować znaków podziałki ręcznie za pomocą panel.segments:

at.x=pretty(c(-10,10)) 
at.y=pretty(c(0,100)) 
xyplot(y~x,data=my.df, 
     par.settings=list(axis.line=list(col="transparent")), 
     scales=list(x=list(at=at.x,labels=at.x), 
     y=list(at=at.y,labels=at.y)), 
     panel=function(...){ 
      panel.xyplot(...) 
      panel.segments(x0=at.x,x1=at.x,y0=-4,y1=-2) 
      panel.segments(x0=-11.5,x1=-11,y0=at.y,y1=at.y) 
     } 
     ) 

hand-made tick marks with panel.segments

ten jest zbliżony do pożądany wynik, ale jest sporo sprytu, aby uzyskać znaczną długość znaczników i przesunąć "ładną" odległość od punktów danych. Wartości te nie będą przekładać się z jednej grafiki na drugą. Ponadto należy zauważyć, że etykiety osi są teraz wyściełane zbyt daleko od znaków podziałki. Jestem pewien, że istnieje sposób na zmniejszenie tego dopełnienia, ale to tylko uczyniłoby kod jeszcze brzydszym i mniej przenośnym.

Więc jak można iść o tłumieniu tylko te linie, które składają się na „pole” wokół działki, pozostawiając ślady zaznaczyć i etykiety osi nienaruszone? Dodatkowe punkty, jeśli takie podejście może być również wykorzystywane do tłumienia niektóre, ale nie wszystkie linie (np opuścić lewą i dolne linie, ale stłumić górne i prawe linie).

Odpowiedz

10

To wciąż nieco hacky, ale przynajmniej nie trzeba robić każdy zastanawianie ręcznie. Wykorzystuje połączenie par.settings i niestandardową axis funkcję, która przyjmuje argument line.col i tymczasowo zmienia kolor linii osi przez wywołanie trellis.par.set:

EDIT (usunięto zbędne zmienianie ustawień krata)

xyplot(y~x,data=my.df, par.settings = list(axis.line = list(col = "transparent")), 
    # Pass custom axis function to argument 'axis' 
    axis = function(side, line.col = "black", ...) { 
    # Only draw axes on the left and bottom 
    if(side %in% c("left","bottom")) { 
     # Call default axis drawing function 
     axis.default(side = side, line.col = "black", ...) 
    } 
    } 
) 

w tej chwili mogę zsumować dlaczego line.col = "black" jest wymagane w argumentach funkcji osi niestandardowych do magii. Domyślam się, że ma to związek z dopasowaniem argumentów do elips (...). Być może jutro będę mądrzejszy i znajdę prawdziwy powód.

Wynika to z:

enter image description here

+0

To wygląda świetnie. Czy mógłbyś przekazać mały komentarz na temat tego, co robi każda linia funkcji osi i dlaczego to robisz?Znajduję dokumentację pomocy w funkcjach osi niskiego poziomu (np. 'Axis.default' nie jest bardzo pouczająca.) – mac

+0

@mac, Okazało się, że było kilka niepotrzebnych zmian opcji kratek, a prawdziwą sztuczką wydaje się być podaj niestandardową funkcję osi jako formalny argument 'line.col'. – BenBarnes

+1

Nicea. FWIW,' line.col = "black" 'jest potrzebne, ponieważ' panel.axis() 'domyślnie przyjmuje kolor linii z' trellis.par. get ("axis.line") ', które wcześniej ustawiłeś na' "transparent" '. –

-1

Najprostszym rozwiązaniem jest użycie funkcji niestandardowych (oś osi). Wystarczy ustawić lwd (szerokość linii) na zero i zaznaczyć znaczniki (lwd.ticks) na coś innego. To działało jak czar!

plot(NA,NA,type="n",xaxt="n", lwd=linewidth, xlim=c(1,24), xlab="", ylab="",ylim=c(-300,500)) 
axis(side = 4, tck = .05, **lwd=0, lwd.ticks=1**, line = 0, labels = NA, col= cols_border[1], col.axis = cols_black) 
axis(side = 4, lwd = 0, line = -4.5, las = 1, cex.axis=axis_fontsize, col= cols_border[1], col.axis = cols_black) 
mtext("Light deviations (lum/sec)",side=4, padj=-2.5, cex=title_fontsize, col="black") 
+0

Wykorzystuje to podstawową grafikę, podczas gdy OP używa pakietu' kratowego'. – BenBarnes

Powiązane problemy