2012-05-10 8 views
8

ggplot'ta grconvertX/grconvertX'in nasıl kullanılacağını anlamaya çalışıyorum. Benim nihai hedefim ggplot2 şekline (ve muhtemelen kafes) grid.text ve grid.lines ile kullanıcı koordinatlarından aygıt koordinatlarına geçerek ek açıklama eklemektir. Biliyorum kurtlarla yapılabilir ama daha kolay bir yol olup olmadığını merak ediyorum. Aşağıdaki kod, kullanıcı koordinatlarından ndc koordinatlarına değerleri aktarmamı ve grid.text ile arsaya açıklama eklemek için bu değerleri kullanmamı sağlar. Mixing X and Y coordinate systems: ggplot2'de grconvertX/grconvertY kullanımı

graphics.off()  # close graphics windows 

library(grid) 
library(gridBase) 


test= data.frame(
    x = c(1,2,3), 
    y = c(12,10,3), 
    n = c(75,76,73) 
) 

par(mar = c(13,5,2,3)) 

plot(test$y ~ test$x,type="b", ann=F) 

for (i in 1:nrow(test)) 

{ 
    X=grconvertX(i , from="user", to="ndc") 
    grid.text(x=X, y =0.2, label=paste("GRID.text at\nuser.x=", i, "\n", "ndc.x=", (signif(X, 5)) )) 
    grid.lines(x=c(X, X), y = c(0.28, 0.33)) 
} 
#add some code to save as PDF ... 

enter image description here

kod önceki mesajların birinden çözümü dayanmaktadır. Orijinal çizimden x koordinatlarının ndc'ye nasıl dönüştürüldüğünü görebilirsiniz. Bu yaklaşımın avantajı, Cihaz I kolayca ggplot2 (ve muhtemelen de kafes) aynı yapabileceği kabul Y

için koordinatları kullanabilmesidir.

library(ggplot2) 
graphics.off()  # close graphics windows 

qplot(x=x, y=y, data=test)+geom_line()+ opts(plot.margin = unit(c(1,3,8,1), "lines")) 

for (i in 1:nrow(test)) 

{ 
    X=grconvertX(i , from="user", to="ndc") 
    grid.text(x=X, y =0.2, label=paste("GRID.text at\nuser.x=", i, "\n", "ndc.x=", (signif(X, 5)) )) 
    grid.lines(x=c(X, X), y = c(0.28, 0.33)) 
} 

#add some code to save as PDF... 

Ancak, düzgün çalışmıyor. Koordinatlar biraz kapalı gibi görünüyor. Dikey çizgiler ve metin, arsadaki onay etiketlerine uymuyor. Birisi bana nasıl düzeltileceğini söyleyebilir mi? Şimdiden çok teşekkürler. ggplot2 ızgara grafik kullanır ise

enter image description here

+0

Sadece kafa kafaya, sorularımdaki biçimlendirmeyi "standart" kod vurgulama için daha iyi uyacak şekilde biçimlendirmekteyim.Ayrıca, bir kullanıcının çalışma alanından tüm nesneleri kaldırmanın, kullanıcıların hızlı bir şekilde kopyalayıp yapıştırma olasılığının yüksek olduğu kodlarda yer almaması en iyisidir. Temiz bir R oturumunda olduklarından emin olmak için okuyucuya bırakın. – joran

+0

Teşekkürler! Temiz bir oturumda çalışmanın daha kolay olacağını düşündüm. Bu kodu artık eklemiyorum. –

cevap

11

grconvertX ve grconvertY işlevleri temel grafik ile çalışır. Genel olarak 2 farklı grafik motoru birlikte iyi oynamamaktadır (yardımcı olmak için gridBase'u kullanarak göstermiş olmanıza rağmen). İlk örneğiniz, temel grafikle başladığınız için çalışır; böylece kullanıcı koordinat sistemi, temel grafikle birlikte bulunur ve bundan grconvertX dönüştürür. İkinci durumda, kullanıcı koordinat sistemi, temel grafiklerde hiçbir zaman ayarlanmadı, bu yüzden benzer bir görünüm elde edebileceğiniz, ancak tam olarak doğru olmayan, benzer, ancak üst viewport koordinatlarıyla aynı olmayan 0,1 varsayılan koordinatlarını kullanabiliyor gibi görünüyor. (Bir hata veya uyarı almadığınıza şaşkınım:

Genel olarak grid grafikleri için koordinatlar arasında dönüştürme eşdeğeri, ilgili koordinat sistemi ile yeni bir görünüm penceresi oluşturmaktır (veya varolan bir görünüm penceresine bas/aç doğru koordinat sistemi ile), sonra bu notta ek açıklamalarınızı ekleyin.

Şimdi, çiziminizi yaratan, ardından ana arsa içeren görünüm alanına ilerleyen, aynı boyutlara sahip yeni bir görünüm alanı oluşturan bir örnek aşağıda verilmiştir. kırpma kapalı, x ölçeği verilere dayalı ve y ölçeği 0,1 olduğunu, o zaman buna göre bazı metinler ekler: burada zor şeylerden

library(ggplot2) 
library(grid) 

test= data.frame( x = c(1,2,3), y = c(12,10,3), n = c(75,76,73) ) 

qplot(x=x, y=y, data=test)+geom_line()+ opts(plot.margin = unit(c(1,3,8,1), "lines")) 

current.vpTree() 
downViewport('panel-3-4') 
pushViewport(dataViewport(test$x, clip='off',yscale=c(0,1))) 

for (i in 1:nrow(test)) { 
    grid.text(x=i, y = -0.2, default.units='native', 
     label=paste("GRID.text at\nuser.x=", i, "\n" )) 
     grid.lines(x=c(i, i), y = c(-0.1, 0), default.units='native') 
} 

biri için görünüm ölçekleri ayarlamak etmediğini ggplot2 olduğunu Çizilen verileri eşleştirin, ancak dönüşümleri kendisi yapar. Bu durumda, ölçek, çalışılan x verisine dayanarak ayarlanmıştır, ancak ggplot2 bir şeyler yapsa, bu işe yaramayabilir. İhtiyacımız olan şey, ggplot2'den geri dönüştürülmüş koordinatları grid.text çağrısında kullanmak için kullanmanın bir yoludur.

+0

Greg: Çok teşekkür ederim! Bu harika bir çözüm. Kodunuzu farklı bir grafikte uyguladım ve gayet iyi çalışıyor gibi görünüyor: http://stackoverflow.com/questions/10525957/how-to-draw-lines-outside-of-plot-area-in-ggplot2 –

+1

+ 1 'tikzDevice' bu zorluğu gidermek için bazı orijinal fikirlerle geldi. Yeni "kukla" koruyucular ve ilişkili geom_s'ı, yalnızca harici (tikz düğümleri) nesneler için tam bir konumlandırma sağlamak amacıyla tanımladılar. Acaba bu fikir genelleştirilebilir mi? – baptiste