[R] R facets including two kinds of charts

phii m@iii@g oii phiiipsmith@c@ phii m@iii@g oii phiiipsmith@c@
Thu Aug 1 22:03:29 CEST 2024


Thank you. That approach could work and I might use it, but a 
complication is that the 100 facets must be in a specified order and 
that order mixes charts of type A and B/C in an unsystematic way. I 
suppose I could write two functions, use them to create all the plots 
and then join them together with cowplot. Or perhaps I could use 
patchwork, with which I am more familiar. I was of course hoping this 
could just be done with facets.

Incidentally this used to work fine with facets (I post the results on 
the web periodically. See 
http://www.philipsmith.ca/Canadian_macroeconomic_indicators/) but 
something must have changed in one of the packages (I'm guessing) and 
that approach suddenly stopped working.

Philip


On 2024-08-01 15:44, Rui Barradas wrote:
> Hello,
> 
> I hadn't understood the problem, sorry.
> The problem are the bar plots, ggplot is plotting one in the "A" facet. 
> And since there is nothing to plot, the bars start at 0.
> 
> A hack is to plot facet "A" separately and then combine the plots with 
> one of several ways to combine ggplot plots. Below is an example with 
> cowplot::plot_grid
> 
> 
> library(ggplot2)
> library(dplyr)
> library(cowplot)
> 
> p1 <- df %>%
>   filter(nm == "A") %>%
>   ggplot(aes(x = date)) +
>   geom_line(aes(y = val2)) +
>   facet_wrap(~ nm, scales = "free_y") +
>   theme(plot.margin = unit(c(0.2, 0, 0.1, 0), "cm"))
> 
> p2 <- df %>%
>   filter(nm != "A") %>%
>   ggplot(aes(x = date)) +
>   geom_col(aes(y = val0), na.rm = TRUE, fill = "white") +
>   geom_line(aes(y = val1)) +
>   ylab("") +
>   facet_wrap(~ nm, scales = "free_y")
> 
> plot_grid(p1, p2, rel_widths = c(1, 2))
> 
> 
> Hope this helps,
> 
> Rui Barradas
> 
> 
> 
> Às 20:10 de 01/08/2024, phil using philipsmith.ca escreveu:
>> Thanks for the suggestion, but this does not give me what I want. Each 
>> chart needs its own unique scale on the y-axis.
>> 
>> Philip
>> 
>> 
>> On 2024-08-01 15:08, Rui Barradas wrote:
>>> Às 19:01 de 01/08/2024, phil using philipsmith.ca escreveu:
>>>> I am asking for help with a ggplot2 program that has facets. There 
>>>> are actually 100 facets in my program, but in the example below I 
>>>> have limited the number to 3. There are two kinds of charts among 
>>>> the facets. One kind is a simple line plot with all of the y-values 
>>>> greater than zero. The facet for "A" in my example below is this 
>>>> kind. The other kind is a line plot combined with a bar chart with 
>>>> some of the y-values being positive and others negative. The facets 
>>>> for "B" and "C" in my example are this kind.
>>>> 
>>>> The facets for "B" and "C" look the way I want them to. However the 
>>>> facet for "A" has a scale on the y-axis that starts at zero, whereas 
>>>> I would like the minimum value on this scale to be non-zero, chosen 
>>>> by ggplot2 to be closer to the minimum value of y for that 
>>>> particular facet.
>>>> 
>>>> My example may not be the most efficient way to achieve this, but it 
>>>> works except for one aspect. Chart A, for which I do not wish to 
>>>> show a zero line, does indeed not show a zero line but it 
>>>> nevertheless chooses a scale for the y-axis that has a minimum value 
>>>> of zero. How can I adjust the code so that it chooses a minimum 
>>>> value on the y-axis that is non-zero and closer to the minimum 
>>>> actual y-value (as would be the case for a simple line chart alone, 
>>>> without any facets)?
>>>> 
>>>> library(ggplot2)
>>>> library(dplyr)
>>>> 
>>>> df <- data.frame(
>>>>    date=c(1,1,1,2,2,2,3,3,3,4,4,4,5,5,5,6,6,6),
>>>> nm=c("A","B","C","A","B","C","A","B","C","A","B","C","A","B","C","A","B","C"),
>>>>    val0=c(NA,-5,4,NA,-3,3,NA,2,4,NA,3,3,NA,3,1,NA,-3,-4),
>>>>    val1=c(NA,-3,6,NA,-1,4,NA,5,5,NA,7,2,NA,4,3,NA,-2,-2),
>>>>    val2=c(50,NA,NA,53,NA,NA,62,NA,NA,56,NA,NA,54,NA,NA,61,NA,NA),
>>>>    zline=c(NA,0,0,NA,0,0,NA,0,0,NA,0,0,NA,0,0,NA,0,0)
>>>> )
>>>> 
>>>> ggplot(df)+
>>>>    geom_col(aes(x=date,y=val0),na.rm=TRUE,fill="white")+
>>>>    geom_line(aes(x=date,y=val1))+
>>>>    geom_line(aes(x=date,y=val2))+
>>>>    geom_hline(aes(yintercept=zline),na.rm=TRUE)+
>>>>    facet_wrap(~nm,scales="free_y")
>>>> 
>>>> Thank you for your assistance.
>>>> 
>>>> Philip
>>>> 
>>>> ______________________________________________
>>>> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
>>>> https://stat.ethz.ch/mailman/listinfo/r-help
>>>> PLEASE do read the posting guide 
>>>> http://www.R-project.org/posting-guide.html
>>>> and provide commented, minimal, self-contained, reproducible code.
>>> Hello,
>>> 
>>> Try to remove
>>> 
>>> scales="free_y"
>>> 
>>> from facet_wrap(). With scales="free_y" each facet will have its own 
>>> y limits, given by the data plotted in each of them. If you want a 
>>> global y limits, don't use it.
>>> 
>>> Hope this helps,
>>> 
>>> Rui Barradas



More information about the R-help mailing list