Setting individual axial limits using facet_wrap and scales = "free" in ggplot2

I am creating a plot facet to view the predicted and actual values ​​side by side with a graph of the predicted value versus residuals. I will use shiny to help explore simulation results using different training parameters. I train the model with 85% of the data, check the remaining 15% and repeat it 5 times, each time collecting actual / forecasted values. After calculating the residuals, my data.frame looks like this:

 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 

What I want:

  • Side by side graph pred vs act and pred vs resid
  • X / y range / limits for pred vs. act should be the same, ideally from min(min(results$act), min(results$pred)) to max(max(results$act), max(results$pred))
  • The x / y range / limit for pred and resid does not depend on what I am doing with the actual or forecasted chart. Calculation for x only from the predicted values ​​and y only from the residual range is excellent.

To view both graphs side by side, I melt the data:

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

Now the plot:

 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) 

This is very close to what I want:

enter image description here

I would like for the ranges x and y for the actual or forecasted to be the same, but I'm not sure how to indicate this, and I do not need this to be done for the predicted and residual since the ranges are completely different.

I tried to add something like this for both scale_x_continous and 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) 

But this raises the min() residual values.

enter image description here

The last idea was to save the value of the minimum variables act and pred until it melts, and then add them to the molten data frame to dictate which face they appear:

 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) 

This does what I want, except that the dots also appear:

enter image description here

Any suggestions for doing something similar?




I saw this idea to add geom_blank() , but I'm not sure how to specify the aes() bit and make it work correctly, or that geom_point() equivalent of using the aes(y = max(..count..)) histogram aes(y = max(..count..)) .




Here is the data to reproduce (my actual, predicted and residual values ​​before melting):

 > 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") 
+56
r ggplot2 facet
Aug 04 '13 at 18:17
source share
3 answers

Here is some code with the geom_blank dummy,

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

enter image description here

+59
Feb 05 '14 at 18:30
source share

I'm not sure I understand what you want, but based on what I understood.

the x scale seems to be the same, this is the y scale, which is not the same, and this is because you specified the scales = "free"

you can specify scale = "free_x" to allow x to be free (in this case it will be the same as pred has the same range by definition)

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

worked for me, see picture

enter image description here

I think you did it too hard - I seem to remember once, defining the limits based on the formula with min and max, and if face, I think she used only these values, but I can not find the code

+11
Feb 05 '14 at 18:15
source share

You can also specify a range using the coord_cartesian command to set the desired y-axis range, as in the previous use scale = 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 

enter image description here

+2
Dec 17 '16 at 16:02
source share



All Articles