2012-11-22 21 views
5

R'de bir efsanede bir linebreak var ve benim problemim grafiklerin beklendiği gibi değil. şöyle My asgari örnektir:R plot içinde Linebreak efsane davranışı

plot(1) 
legendLabel<-c("t\nu ","tu","wh","trr\nni") 
legend("top",legend=legendLabel,horiz=TRUE,fill=c("red","blue","gray","black")) 

Ben efsane üst ve alt marj eşit olduğunu beklenir, ancak bu durum böyle değil. enter image description here

Ekli görüntüde de gördüğünüz gibi, alt kenar boşluğu üstte daha küçüktür.

Herhangi birinin nasıl düzeltilebileceği hakkında bir fikri var mı, yoksa herhangi biri sorunun ne olduğunu söyleyebilir mi?

Teşekkürler.

+1

Ben de pes ediyorum. Kutuyu 'bty = "n" ile kaldırmak ve bir 'polygon' eklemek istiyorsanız tercih edebilirsiniz. –

cevap

2

sayesinde @ Marc kutusuna 'iyi bir çalışma çözüm bulundu. saat olarak kutu devre dışı E bty="n" ile anlattı ve sonra

ld<-legend("top",legend=legendLabel, cex=0.65, fill=colorNames, horiz=TRUE,bty="n") 
    height<-(ld$rect$top-ld$text$y[1])*2 
    xs <- c(ld$rect$left, ld$rect$left, ld$rect$left+ld$rect$w, ld$rect$left+ld$rect$w) 
    ys <- c(ld$rect$top, ld$rect$top-height, ld$rect$top-height, ld$rect$top) 
    polygon(x = xs , y = ys) 

yüzden ilk üst köşesinde ve veri noktası ve afterwords bu bilgiler bir poligon ile çizmek arasındaki mesafeyi hesapladı. Oldukça genel olarak gördüğüm kadarıyla çalışır.

Teşekkürler.

4

Tamam, sizin için bir çözüm bulduğuma inanıyorum. Lejant konum bilgisini ld adlı bir nesneye kaydettim ve daha sonra bu koordinatlara dayanarak bir polygon oluşturun. Anlamak biraz zor, ama ben temel olarak birkaç noktanın uzunlukları ile poligonu genişletiyorum. Bunu yapmak için ilk olarak karakter boyutunu par()$cin ile inç olarak almalı ve pointsize'yi bu boyutlara (72'ye bölün ve par()$ps ile çarpın. Daha sonra bunu almak için par()$usr ile ölçeklendirerek arsa birimlerine dönüştürmeliydim. karakter genişliği (Bence bu doğru - her durumda çalışır!) Bu birimlerden 3'ü ld koordinatının soluna ekledim, 2 sağa, 1 yukarı ve 1 aşağı. İşte sonuç ve kod:

enter image description here

plot(1) 
legendLabel<-c("t\nu ","tu","wh","trr\nni") 
ld <- legend("top",legend=legendLabel,horiz=TRUE,fill=c("red","blue","gray","black"), bty="n") 

CIN <- par()$cin 
PS <- par()$ps 
USR <- par()$usr 
CIN.USR <- c((CIN[1]/72*PS)/(USR[2]-USR[1]), (CIN[2]/72*PS)/(USR[4]-USR[3])) 

xs <- c(ld$text$x[1], ld$text$x[1], ld$text$x[length(ld$text$x)], ld$text$x[length(ld$text$x)]) 
ys <- c(ld$text$y[1], ld$text$y[1], ld$text$y[length(ld$text$x)], ld$text$y[length(ld$text$x)]) 

polygon(
x = xs + c(-3*CIN.USR[1], -3*CIN.USR[1], 2*CIN.USR[1], 2*CIN.USR[1]), 
y = ys+c(-1*CIN.USR[2], 1*CIN.USR[2], 1*CIN.USR[2], -1*CIN.USR[2]) 
) 
+0

Cevabınız için teşekkürler, bana göre bir çalışma çözümü buldum. Seninkiyle problemi kullanıyorum: 'barplot (matris (data, nr = 6), names.arg = isim, yanında = FALSE, xlim = range (0,100), ylim = range (0,12), horiz = TRUE) 've kodunuz sadece katı bir çizgi çiziyor. – steffenmauch