Facet_wrap ve ölçekler = ggplot2'de "serbest" ile ayrı eksen limitlerini ayarlama


115

Tahmin edilen ve gerçek değerleri yan yana görüntülemek için, tahmin edilen değer ve kalıntıların bir grafiğiyle birlikte yönlü bir grafik oluşturuyorum. shinyFarklı eğitim parametreleri kullanarak modelleme çabalarının sonuçlarını keşfetmeye yardımcı olmak için kullanacağım. Modeli, verilerin% 85'i ile eğitiyorum, kalan% 15'i test ediyorum ve her seferinde gerçek / tahmin edilen değerleri toplayarak bunu 5 kez tekrarlıyorum. Kalıntıları hesapladıktan sonra data.frameşuna benziyorum:

head(results)
       act     pred       resid
2 52.81000 52.86750 -0.05750133
3 44.46000 42.76825  1.69175252
4 54.58667 49.00482  5.58184181
5 36.23333 35.52386  0.70947731
6 53.22667 48.79429  4.43237981
7 41.72333 41.57504  0.14829173

İstediğim:

  • predVs. actve predvs.'nin yan yana grafiğiresid
  • X / Y aralığı / limitleri predvs actideal olarak, aynı olması min(min(results$act), min(results$pred))içinmax(max(results$act), max(results$pred))
  • X / y aralığı / limitleri predvs. resid değil ben gerçek vs tahmin arsa için ne etkilenecek. xYalnızca tahmin edilen değerlerin yüzerinde ve yalnızca artık aralığın üzerinde çizim yapmak iyidir.

Her iki grafiği de yan yana görüntülemek için verileri eritiyorum:

library(reshape2)
plot <- melt(results, id.vars = "pred")

Şimdi arsa:

library(ggplot2)
p <- ggplot(plot, aes(x = pred, y = value)) + geom_point(size = 2.5) + theme_bw()
p <- p + facet_wrap(~variable, scales = "free")

print(p)

İstediğim şeye oldukça yakın:

görüntü açıklamasını buraya girin

İstediğim şey, gerçek ve tahmin edilen x ve y aralıklarının aynı olması, ancak bunu nasıl belirleyeceğimi bilmiyorum ve tahmin edilene karşı kalan grafik için bunun yapılmasına ihtiyacım yok . aralıklar tamamen farklıdır.

Her ikisi için de buna benzer bir şey eklemeyi denedim scale_x_continousve scale_y_continuous:

min_xy <- min(min(plot$pred), min(plot$value))
max_xy <- max(max(plot$pred), max(plot$value))

p <- ggplot(plot, aes(x = pred, y = value)) + geom_point(size = 2.5) + theme_bw()
p <- p + facet_wrap(~variable, scales = "free")
p <- p + scale_x_continuous(limits = c(min_xy, max_xy))
p <- p + scale_y_continuous(limits = c(min_xy, max_xy))

print(p)

Ancak bu min(), artık değerleri alır.

görüntü açıklamasını buraya girin

Sahip olduğum son bir fikir, erimeden önce minimum actve preddeğişkenlerin değerini saklamak ve ardından bunları erimiş veri çerçevesine eklemek ve hangi fasette göründüklerini dikte etmekti:

head(results)
       act     pred       resid
2 52.81000 52.86750 -0.05750133
3 44.46000 42.76825  1.69175252
4 54.58667 49.00482  5.58184181
5 36.23333 35.52386  0.70947731

min_xy <- min(min(results$act), min(results$pred))
max_xy <- max(max(results$act), max(results$pred))

plot <- melt(results, id.vars = "pred")

plot <- rbind(plot, data.frame(pred = c(min_xy, max_xy),
  variable = c("act", "act"), value = c(max_xy, min_xy)))

p <- ggplot(plot, aes(x = pred, y = value)) + geom_point(size = 2.5) + theme_bw()
p <- p + facet_wrap(~variable, scales = "free")

print(p)

Puanların da ortaya çıkması dışında istediğim şey bu:

görüntü açıklamasını buraya girin

Böyle bir şey yapmak için herhangi bir öneriniz var mı?


Bu fikri eklemek için gördüm geom_blank(), ancak aes()biti nasıl belirleyeceğimi ve düzgün çalışmasını geom_point()sağlayacağımı veya histogram kullanımına eşdeğerinin ne olduğundan emin değilim aes(y = max(..count..)).


İşte oynanacak veriler (eritmeden önceki gerçek, tahmin edilen ve artık değerlerim):

> dput(results)
structure(list(act = c(52.81, 44.46, 54.5866666666667, 36.2333333333333, 
53.2266666666667, 41.7233333333333, 35.2966666666667, 30.6833333333333, 
39.25, 35.8866666666667, 25.1, 29.0466666666667, 23.2766666666667, 
56.3866666666667, 42.92, 41.57, 27.92, 23.16, 38.0166666666667, 
61.8966666666667, 37.41, 41.6333333333333, 35.9466666666667, 
48.9933333333333, 30.5666666666667, 32.08, 40.3633333333333, 
53.2266666666667, 64.6066666666667, 38.5366666666667, 41.7233333333333, 
25.78, 33.4066666666667, 27.8033333333333, 39.3266666666667, 
48.9933333333333, 25.2433333333333, 32.67, 55.17, 42.92, 54.5866666666667, 
23.16, 64.6066666666667, 40.7966666666667, 39.0166666666667, 
41.6333333333333, 35.8866666666667, 25.1, 23.2766666666667, 44.46, 
34.2166666666667, 40.8033333333333, 24.5766666666667, 35.73, 
61.8966666666667, 62.1833333333333, 74.6466666666667, 39.4366666666667, 
36.6, 27.1333333333333), pred = c(52.8675013282404, 42.7682474758679, 
49.0048248585123, 35.5238560262515, 48.7942868566949, 41.5750416040131, 
33.9548164913007, 29.9787449128663, 37.6443975781139, 36.7196211666685, 
27.6043278172077, 27.0615724310721, 31.2073056885252, 55.0886903524179, 
43.0895814712768, 43.0895814712768, 32.3549865881578, 26.2428426737583, 
36.6926037128343, 56.7987490221996, 45.0370788180147, 41.8231642271826, 
38.3297859332601, 49.5343916620086, 30.8535641206809, 29.0117492750411, 
36.9767968381391, 49.0826677983065, 54.4678549541069, 35.5059204731218, 
41.5333417555995, 27.6069075391361, 31.2404889715121, 27.8920960978598, 
37.8505531149324, 49.2616631533957, 30.366837650159, 31.1623492639066, 
55.0456078770405, 42.772538591063, 49.2419293590535, 26.1963523976241, 
54.4080781796616, 44.9796700541254, 34.6996927469131, 41.6227713664027, 
36.8449646519306, 27.5318686661673, 31.6641793552795, 42.8198894266632, 
40.5769177148146, 40.5769177148146, 29.3807781312816, 36.8579132935989, 
55.5617033901752, 55.8097119335638, 55.1041728261666, 43.6094641699075, 
37.0674887276681, 27.3876960746536), resid = c(-0.0575013282403773, 
1.69175252413213, 5.58184180815435, 0.709477307081826, 4.43237980997177, 
0.148291729320228, 1.34185017536599, 0.704588420467079, 1.60560242188613, 
-0.832954500001826, -2.50432781720766, 1.98509423559461, -7.93063902185855, 
1.29797631424874, -0.169581471276786, -1.51958147127679, -4.43498658815778, 
-3.08284267375831, 1.32406295383237, 5.09791764446704, -7.62707881801468, 
-0.189830893849219, -2.38311926659339, -0.541058328675241, -0.286897454014273, 
3.06825072495888, 3.38653649519422, 4.14399886836018, 10.1388117125598, 
3.03074619354486, 0.189991577733821, -1.82690753913609, 2.16617769515461, 
-0.088762764526507, 1.47611355173427, -0.268329820062384, -5.12350431682565, 
1.5076507360934, 0.124392122959534, 0.147461408936991, 5.34473730761318, 
-3.03635239762411, 10.1985884870051, -4.18300338745873, 4.31697391975358, 
0.0105619669306023, -0.958297985263961, -2.43186866616734, -8.38751268861282, 
1.64011057333683, -6.36025104814794, 0.226415618518729, -4.80411146461488, 
-1.1279132935989, 6.33496327649151, 6.37362139976954, 19.5424938405001, 
-4.17279750324084, -0.467488727668119, -0.254362741320246)), .Names = c("act", 
"pred", "resid"), row.names = c(2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 
10L, 11L, 12L, 13L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 
24L, 25L, 26L, 28L, 29L, 30L, 31L, 32L, 33L, 34L, 35L, 36L, 37L, 
38L, 39L, 41L, 42L, 43L, 44L, 45L, 46L, 47L, 48L, 49L, 50L, 51L, 
52L, 54L, 55L, 56L, 57L, 58L, 59L, 60L, 61L, 62L, 63L, 64L, 65L
), class = "data.frame")

Sadece merak ediyorum - neden gerçek ve kalıntıları aynı grafikte göstermiyorsunuz?
Ricardo Saporta

2
Grafikleri ayrı ayrı oluşturur ve sonra kullanırdım grid.arrange.
joran

@RicardoSaporta Örnek olarak bağlantı verebileceğiniz bir Google resmi var mı? ggplot(plot, aes(x = pred, y = value)) + geom_point()Erime sonrası verileri kullanarak, fasetleme olmadan yapacağımı mı öneriyorsunuz? Bu, rastgele olmama / çarpıklığı tespit etmeyi zorlaştırmak için kalıntıların ölçeğini gerçekten küçültmez mi?
Hendy

1
Diğer yorumum ise fasetlemenin daha az kod olduğu ... Sadece eritmek zorunda kaldım, sonra variableyarattığı değere göre arsa ve faset yapmalıydım melt(). Sonra tekrar, sanırım bunları lapplyçeşitli kombinasyonları çizmek için oluşturulan bir listede saklayabilirim . Giriş için teşekkürler. Bir gridçözüm oluşturmak istiyorsanız , cevabı kabul edebilirim, ancak bu bizim gridizlediğimiz yolsa , bu diğer temelli çözümlerin bir kopyası da olabilir .
Hendy

1
@joran ve ben ben rutin insanları tavsiye ediyorum bulmak değil kullanımına grid.arrangehemen hemen her zaman düzenini karıştıran biridir. Keşke gtable'ın uzun süredir devam eden hatalarının giderilmesi.
baptiste

Yanıtlar:


115

İşte sahte geom_blankkatmana sahip bazı kodlar ,

range_act <- range(range(results$act), range(results$pred))

d <- reshape2::melt(results, id.vars = "pred")

dummy <- data.frame(pred = range_act, value = range_act,
                    variable = "act", stringsAsFactors=FALSE)

ggplot(d, aes(x = pred, y = value)) +
  facet_wrap(~variable, scales = "free") +
  geom_point(size = 2.5) + 
  geom_blank(data=dummy) + 
  theme_bw()

görüntü açıklamasını buraya girin


11
Bunun güzel bir çeşidi expand_limits(pred=range_act, value=range_act), kullanan geom_blankama kullanımı daha basittir.
eregon

6
Bu yalnızca sınırları genişletir (ancak daralmaz) Aralığı kısaltmanın bir yolu var mı? @baptiste
Indranil Gayen

32

Ne istediğini anladığımdan emin değilim, ama anladığıma göre

x ölçeği aynı görünüyor, aynı olmayan y ölçeğidir ve bunun nedeni ölçekleri = "serbest" olarak belirtmiş olmanızdır

Yalnızca x'in serbest olmasına izin vermek için ölçekler = "free_x" belirtebilirsiniz (bu durumda, önceden tanımlı olarak aynı aralığa sahiptir)

p <- ggplot(plot, aes(x = pred, y = value)) + geom_point(size = 2.5) + theme_bw()
p <- p + facet_wrap(~variable, scales = "free_x")

benim için çalıştı, resme bak

görüntü açıklamasını buraya girin

Sanırım bunu çok zorlaştırıyorsun - limitleri min ve max ile bir formüle göre tanımladığını bir kez hatırlıyorum ve yönlü ise sadece bu değerleri kullandığını düşünüyorum, ancak kodu bulamıyorum


7

İstediğiniz y ekseni aralığını ayarlamak için coord_cartesian komutuyla aralığı da belirtebilirsiniz, önceki gönderideki gibi scales = free_x kullanın

p <- ggplot(plot, aes(x = pred, y = value)) +
     geom_point(size = 2.5) +
     theme_bw()+
     coord_cartesian(ylim = c(-20, 80))
p <- p + facet_wrap(~variable, scales = "free_x")
p

görüntü açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.