Definindo limites de eixo individuais com facet_wrap e scale = “free” em ggplot2

Estou criando um gráfico facetado para ver os valores previstos x reais lado a lado com um gráfico do valor previsto versus os resíduos. Estarei usando shiny para ajudar a explorar os resultados dos esforços de modelagem usando diferentes parâmetros de treinamento. Eu treino o modelo com 85% dos dados, teste os 15% restantes e repito isso 5 vezes, coletando valores reais / previstos a cada vez. Depois de calcular os resíduos, meu data.frame fica assim:

 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 

O que eu quero:

  • Lote lado a lado de pred vs. act e pred vs. resid
  • O intervalo / limite x / y para pred versus act para ser o mesmo, idealmente de min(min(results$act), min(results$pred)) a max(max(results$act), max(results$pred))
  • O intervalo x / y / limites para pred vs. resid não deve ser afetado pelo que eu faço para o gráfico real vs. previsto. Plotando para x sobre apenas os valores previstos e y sobre apenas o intervalo residual é bom.

Para ver as duas plots lado a lado, eu derreto os dados:

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

Agora trama:

 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) 

Isso é bem perto do que eu quero:

insira a descrição da imagem aqui

O que eu gostaria é que os intervalos xey para o real versus o predito sejam os mesmos, mas não tenho certeza de como especificar isso, e eu não preciso disso para o gráfico predito versus residual desde que o intervalos são completamente diferentes.

Eu tentei adicionar algo assim para scale_x_continous e 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) 

Mas isso pega o min() dos valores residuais.

insira a descrição da imagem aqui

Uma última ideia que tive foi armazenar o valor das variables ​​mínimas act e pred antes de fundir, e depois adicioná-las ao quadro de dados derretido para ditar em qual faceta eles aparecem:

 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) 

Isso faz o que eu quero, com a exceção de que os pontos também aparecem:

insira a descrição da imagem aqui

Alguma sugestão para fazer algo assim?


Eu vi essa idéia para adicionar geom_blank() , mas não tenho certeza como especificar o bit aes() e tê-lo funcionando corretamente, ou o que o equivalente geom_point() é para o uso do histograma de aes(y = max(..count..)) .


Aqui estão os dados para brincar (meus valores reais, previstos e residuais antes da fusão):

 > 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") 

Aqui está algum código com uma camada geom_blank fictícia,

 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() 

insira a descrição da imagem aqui

Não tenho certeza se entendi o que você quer, mas com base no que entendi

a escala x parece ser a mesma, é a escala y que não é a mesma, e isso é porque você especificou escalas = “livre”

você pode especificar escalas = “free_x” para permitir que x seja livre (neste caso, é o mesmo que pred tem o mesmo intervalo, por definição)

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

trabalhou para mim, veja a foto

insira a descrição da imagem aqui

Eu acho que você estava fazendo isso muito difícil - eu pareço lembrar uma vez definindo os limites com base em uma fórmula com min e max e se facetada eu acho que usou apenas esses valores, mas não consigo encontrar o código

Você também pode especificar o intervalo com o comando coord_cartesian para definir o intervalo do eixo y desejado, como na postagem anterior use scales = free_x

 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 

insira a descrição da imagem aqui