2012-05-08 25 views
11

Bir dizi yatay gruplandırılmış çubuk grafik üretmem gerekiyor. Arplot işlevi, çizimin kenar boşluklarını otomatik olarak ayarlamaz, bu nedenle metin kesilir. SAS içindeYatay çubuk grafikte kenar boşluklarının otomatik olarak ayarlanması

graphics.off()  # close graphics windows 
    test <- matrix(c(55,65,30, 40,70,55,75,6,49,45,34,20), 
        nrow =3 , 
       ncol=4, 
       byrow=TRUE, 
       dimnames = list(c("Subgroup 1", "Subgroup 2", "Subgroup 3"), 
           c(
           "Category 1 Long text", 
           "Category 2 very Long text", 
           "Category 3 short text", 
           "Category 4 very short text" 
           ))) 
    barplot(test, 
     las=2, 
     beside = TRUE, 
     legend=T, 
     horiz=T) 

enter image description here

otomatik olarak daha fazla sağda arsa taşımak için bir seçenek bulamıyorum yolu Ar dotchart işlevi yapar ((barchart prosedürü) da otomatik olarak marjları ayarlar. Açıkçası, ben her zaman par işlevini kullanarak manuel olarak marjları ayarlayabilirsiniz.

par(mar=c(5.1, 13 ,4.1 ,2.1)) 

sağ

etme amaçlı planı hareket edecek

Grafiği sağa hareket ettirmek için bir seçenek var mı (ör. metnin uzunluğuna bağlı olarak otomatik olarak kenar boşluklarını ayarlamak?

ben programlı yapmak 2 ile ilgili appproaches düşünebilirsiniz: 1) en uzun metin dizesinin uzunluğunu hesaplayın ve buna göre sol kenar boşluğu ayarlamak 2) veriler için bir dotchart çizimi oluşturun, nasılsa marjları ve kullanımını yakalamak çubuk grafikte aynı marjlar.

Bunu yapmanın daha kolay bir yolu var mı? Teşekkürler!

cevap

11

Bence ilk fikriniz muhtemelen en uygun olanıdır. Böyle bir şey işe yaramıyor gibi görünüyor ve fazla doldurma gerektirmez.

ylabels <- c( "1oooooooooooo", 
      "2", 
      "3", 
      "4" 
) 

test <- matrix(c(55,65,30, 40,70,55,75,6,49,45,34,20), 
        nrow =3 , 
       ncol=4, 
       byrow=TRUE, 
       dimnames = list(c("Subgroup 1", "Subgroup 2", "Subgroup 3"), 
           ylabels)) 

# adjust to the maximum of either the default 
# or a figure based on the maximum length 
par(mar=c(5.1, max(4.1,max(nchar(ylabels))/1.8) ,4.1 ,2.1)) 

barplot(test, 
     las=2, 
     beside = TRUE, 
     legend=T, 
     horiz=T) 

dotchart teftiş ettikten sonra bir daha genellenebilir çözüm de kullanmak olabilir:

linch <- max(strwidth(ylabels, "inch")+0.4, na.rm = TRUE) 
par(mai=c(1.02,linch,0.82,0.42)) 
+0

teşekkür ederiz! Kodunuzu farklı metin dizeleriyle denedim, kenar boşlukları iyi çalışıyor. 1.8 ile nasıl geldin? –

+0

@MaxCherny - sadece nchar üzerinde bazı temel aritmetik: marj oranı ve biraz deneme yanılma hatası. Farklı yazı tipi boyutlarına/stillerine uyarlanabileceğine söz veremem ama hesaplamalar görebileceğiniz gibi kolayca ayarlanabilir. – thelatemail

+0

@thelatemail - Yukarıdaki çözümün genişleme faktörlerini hesaba katıp katmadığını merak ediyorum, cex.lab = 2'yi varsayılan 1 yerine ayarladığımı söyleyin. Teşekkürler! – Alex