Note that there are some explanatory texts on larger screens.

plurals
  1. POHow to enforce ggplot's position_dodge on categories with no data?
    primarykey
    data
    text
    <p>I'm trying to use position_dodge on ggplot to obtain boxplots of two different signals (ind) sharing the same categories (cat). When there is a category with data for one signal but not for the other one, the boxplot for the signal with data covers all the horizontal spacing, and does not respect the position_dodge instruction for that particular category. Is there a way to make ggplot to enforce the dodging rule? As you can see on the example below, the signal x has no data for category B, so it loses the space reserved by position_dodge. I would like to avoid that.</p> <p>Thanks in advance.</p> <pre><code>data&lt;-data.frame(cat=c('A','A','A','A','B','B','A','A','A','A','B','B'), values=c(3,2,1,4,NA,NA,4,5,6,7,8,9), ind=c('x','x','x','x','x','x','y','y','y','y','y','y')) print(ggplot() + scale_colour_hue(guide='none') + geom_boxplot( aes(x=as.factor(cat), y=values, fill=ind), position=position_dodge(width=.60), data=data, outlier.size = 1.2, na.rm=T)) </code></pre> <p><img src="https://i.stack.imgur.com/rKbeq.png" alt="graph with original problem"></p> <h1>PROGRESS UPDATE</h1> <p>After some workarounds, I came up with the outcome I was looking for... (kind of) </p> <pre><code>data &lt;- data.frame( cat=c('A','A','A','A','B','B','A','A','A','A','B','B','B'), values=c(3,2,1,4,NA,NA,4,5,6,7,8,9, 0), ind=c('x','x','x','x','x','x','y','y','y','y','y','y','x')) p &lt;- ggplot() + scale_colour_hue(guide='none') + geom_boxplot(aes(x=as.factor(cat), y=values, fill=ind), position=position_dodge(width=.60), data=data, outlier.size = 1.2, na.rm=T) + geom_line(aes(x=x, y=y), data=data.frame(x=c(0,3),y=rep(0,2)), size = 1, col='white') print(p) </code></pre> <p><img src="https://i.stack.imgur.com/G66bR.png" alt="solution with workaround"></p> <p>Some people remcomended using faceting for the effect I wanted. Faceting doesn't give me the effect I'm looking for. The final graph I was looking for is shown below:</p> <p><img src="https://i.stack.imgur.com/HHTZ8.png" alt="final graph"></p> <p>If you notice, the white major tick mark at y = 10 is thicker than the other tick marks. This thicker line is the geom_line with size=1 that hides unwanted boxplots.</p> <p>I wish we could combine different geom objects more seamlessly. I reported this as a bug on Hadley's github, but Hadley said this is how position_dodge behaves by design. I guess I'm using ggplot2 in a non-standard way and workarounds are the way to go on these kind of issues. Anyways, I hope this helps some of the R folks to push ggplot great functionality a little further.</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload