2012-10-15 16 views
9

Eksen ölçeğindeki onay işaretlerini koruyarak kutuyu xyplot'un etrafından çıkarmakla nasıl gidebilirim? Edward Tufte'nin minimalist veri grafik estetiğinin ruhu içinde, bu eksen çizgileri "veri olmayan mürekkep" ve "silinmiş" olabilir.R kafes xyplot üzerinde eksen ve eksen çizgileri ayrı ayrı kontrol ediliyor

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

Öyle görünüyor ki kafes ekran parametreleri (örneğin axis.line$col) kontrol eksen çizgileri ve eksen birlikte keneler hem:

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

with axis.line$col="transparent"

... ki İstenen sonuç değil, bu yüzden kutudan çıkarken hatları kapatmak için basit bir yol gibi görünmüyor.

Ben ile gelip başardık iyi ben panel.segments kullanarak elle kene işaretleri oluşturmak kaba kuvvet kesmek olduğunu

:

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

Bu yakındır İstenen sonuç, ancak onay işaretlerinin makul bir uzunlukta olması ve veri noktalarından "güzel" bir uzaklığı telafi etmesi için gerekli oldukça fazla şey vardır. Bu değerler bir grafikten diğerine çeviri yapmaz. Ayrıca, eksen etiketlerinin artık onay işaretlerinden çok uzakta olduğunu unutmayın. Eminim ki bu dolguyu azaltmanın bir yolu var, ama bu sadece kodu daha da çirkin ve daha az taşınabilir hale getirecektir.

Peki, işaret çizgileri ve eksen etiketleri bozulmadan bırakılırken, çizim alanının etrafında "kutu" oluşturan satırların bastırılması nasıl yapılır? Bu yaklaşımın bir kısmını bastırmak için kullanılabiliyor olması, ancak tüm satırların kullanılmaması durumunda (eğer sol ve alt satırları terk etse de, üst ve sağ çizgileri bastıran) bonus puanları.

cevap

10

Bu hala biraz hacky, ama en azından el ile bir şey yapmak zorunda değilsiniz.

DÜZENLEME (kafes ayarlarının kaldırıldı gereksiz değiştirmeyen)

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", ...) 
    } 
    } 
) 
: Bu par.settings bir arada ve bir argüman line.col alır ve geçici trellis.par.set çağrısıyla eksen çizgisi rengini değiştiren bir özel axis işlevi kullanır

Şu anda, özel eksen işlevinin argümanlarında sihirbaz olarak neden line.col = "black" gerektiğini belirtiyorum. Benim tahminim, elipslerle (...) argüman eşleştirmesi ile ilgili olması. Belki de yarın daha akıllı olacağım ve gerçek sebebi bulacağım.

enter image description here

+0

Bu harika görünüyor. Eksen işlevinin her satırının ne yaptığını ve neden bunu yaptığınızı anlatan bir yorum sunabilir misiniz?Düşük seviyeli eksen işlevleriyle ilgili yardım belgelerini buluyorum ('axis.default' çok aydınlatıcı değil) – mac

+0

@mac, Trellis seçeneklerinde bazı gereksiz değişiklikler olduğunu ve gerçek hilenin özel eksen işlevine "line.col" biçiminde bir resmi argüman sağlar. – BenBarnes

+1

Güzel. FWIW, 'line.col =" black "' gereklidir; çünkü panel.axis() varsayılan olarak satır rengini trellis.par'dan alır. Daha önce “saydam” olarak ayarladığınız ("axis.line") 'ı döndürün. –

-1

yapılacak en kolay şey özel eksen fonksiyonunu (eksen) kullanmaktır:

Bu sonuçlanır. Sadece lwd'yi (satır genişliği) sıfıra ayarlayın ve başka bir şeye işaretler (lwd.ticks). Bir çekicilik gibi çalıştı!

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

Bu, temel grafikleri kullanır, oysa OP, 'kafes' paketini kullanır. – BenBarnes