2016-01-13 11 views
6

ggplot2::ggplot() ile oluşturduğum bir arsaya küçük bir özet tablosu eklemeyi denedim. Tablo, kaydedilen ggplot nesnesine gridExtra::tableGrob() üzerinden eklenir.gridExtra ve annotation_custom() ile ggplot'a bir tablo ekleme y ekseni sınırlarını değiştirir

Benim sorunum, bu, orijinal arsamın y sınırlarını değiştiriyor gibi görünüyor. ylim() aracılığıyla sınırları tekrar belirtmek zorunda kalmadan bundan kaçınmanın bir yolu var mı? İşte

ChickWeight veri kümesini kullanarak probleminden minimum örnektir:

# load packages 
require(ggplot2) 
require(gridExtra) 

# create plot 
plot1 = ggplot(data = ChickWeight, aes(x = Time, y = weight, color = Diet)) + 
     stat_summary(fun.data = "mean_cl_boot", size = 1, alpha = .5) 
plot1 
# create table to add to the plot 
sum_table = aggregate(ChickWeight$weight, 
         by=list(ChickWeight$Diet), 
         FUN = mean) 
names(sum_table) = c('Diet', 'Mean') 
sum_table = tableGrob(sum_table) 

# insert table into plot 
plot1 + annotation_custom(sum_table) 

ylim problem with annotation_custom()

DÜZENLEME: Sadece stat_summary() ile ilgili bir sorun gibi görünüyor anladım. Başka bir geom/katman kullandığımda, sınırlar orijinal çizimde oldukları gibi kalır. Bunun için başka bir örneği:

plot2 = ggplot(data = ChickWeight, aes(x = Time, y = weight, color = Diet)) + 
     geom_jitter() 
plot2 
plot2 + annotation_custom(sum_table) 

ylim problem with annotation_custom()

+0

Sorundan emin değilim, ama bunun "stat_summary" ile bir sorun olduğunu düşünmüyorum. "Plot2 + stat_summary (fun.data =" mean_cl_boot ", size = 1, alpha = .5) + annotation_custom (sum_table) 'o zaman ylimiz korunur. – George

+0

Bu ilginç. 'Geom =' pointrange '(' stat_summary 'varsayılan olarak kullanır) yerine, tüm veri aralığı için y sınırlarını ayarlar. Yani eğer bunu doğru görüyorsam, ilk örneğimde ylim özetlenen ve gösterilen değerlerin aralığına ("pointrange") göre ayarlandı, ancak "annotation_custom" ifadesini eklerken tüm verilerin aralığını tekrar kullanır. – abel

cevap

4

plot1 için y-aralık plot2 farklıdır, olma nedeni annotation_custom orijinal aes tablosu değil, stat_summary() tarafından kullanılan değiştirilmiş veri çerçevesi onun estetik alır . İki arsa için y-aralıkları aynı olsun (ya da kabaca aynı - aşağıya bakınız), annotation_custom'un estetiğini orijinal verilerden alın. Yani 'u stat_summary()'un içinde hareket ettirin. Bu arada

enter image description here

# load packages 
require(ggplot2) 
require(gridExtra) 

# create plot 
plot1 = ggplot(data = ChickWeight) + 
     stat_summary(aes(x = Time, y = weight, color = Diet), fun.data = "mean_cl_boot", size = 1, alpha = .5) 
plot1 

# create table to add to the plot 
sum_table = aggregate(ChickWeight$weight, 
         by=list(ChickWeight$Diet), 
         FUN = mean) 
names(sum_table) = c('Diet', 'Mean') 
sum_table = tableGrob(sum_table) 

# insert table into plot 
plot2 = plot1 + annotation_custom(sum_table, xmin = 10, xmax = 10, ymin = 200, ymax = 200) 
plot2 

, iki parsel aynı y-aralık vermeyecektir nedeni stat_summary() içinde önyükleme işleviyle ilgilidir. Gerçekten, ardı ardına p1 çizin ve y aralığında küçük değişiklikler fark edebilirsiniz. Veya yapı verilerindeki y aralıklarını kontrol edin. büyük zaman kadar işlevlerini değerlendirmez ggplot

ggplot_build(plot1)$layout$panel_ranges[[1]]$y.range 
ggplot_build(plot2)$layout$panel_ranges[[1]]$y.range 

hatırlayın - her P1 veya P2 çekilir, yeni bir önyükleme örnek seçilir.

İlgili konular