Put a break in the Y-Axis of a histogram
Asked Answered
P

2

13

I'm not sure exactly what to call this, but I'm trying to achieve a sort of "broken histogram" or "axis gap" effect: http://gnuplot-tricks.blogspot.com/2009/11/broken-histograms.html (example is in gnuplot) with R.

It looks like I should be using the gap.plot() function from the plotrix package, but I've only seen examples of doing that with scatter and line plots. I've been able to add a break in the box around my plot and put a zigzag in there, but I can't figure out how to rescale my axes to zoom in on the part below the break.

The whole point is to be able to show the top value for one really big bar in my histogram while zooming into the majority of my bins which are significantly shorter. (Yes, I know this could potentially be misleading, but I still want to do it if possible)

Any suggestions?

Update 5/10/2012 1040 EST:

If I make a regular histogram with the data and use <- to save it into a variable (hdata <- hist(...)), I get the following values for the following variables:

hdata$breaks
 [1] 0.00 0.20 0.21 0.22 0.23 0.24 0.25 0.26 0.27 0.28 0.29 0.30 0.31 0.32 0.33
[16] 0.34 0.35 0.36 0.37 0.38 0.39 0.40 0.41 0.42 0.43 0.44 0.45 0.46 0.47 0.48
[31] 0.49 0.50 0.51 0.52 0.53 0.54 0.55 0.56 0.57 0.58 0.59 0.60 0.61 0.62 0.63
[46] 0.64 0.65 0.66 0.67 0.68 0.69 0.70 0.71 0.72 0.73 0.74 0.75 0.76 0.77 0.78
[61] 0.79 0.80 0.81 0.82 0.83 0.84 0.85 0.86 0.87 0.88 0.89 0.90 0.91 0.92 0.93
[76] 0.94 0.95 0.96 0.97 0.98 0.99 1.00

hdata$counts
 [1]    675      1      0      1      2      2      0      1      0      2
[11]      1      1      1      2      5      2      1      0      2      0
[21]      2      1      2      2      1      2      2      2      6      1
[31]      0      2      2      2      2      3      5      4      0      1
[41]      5      8      6      4     10      3      7      7      4      3
[51]      7      6     16     11     15     15     16     25     20     22
[61]     31     42     48     62     57     45     69     70     98    104
[71]     79    155    214    277    389    333    626    937   1629   3471
[81] 175786

I believe I want to use $breaks as my x-axis and $counts as my y-axis.

Phenomenalism answered 8/5, 2012 at 19:2 Comment(3)
For a solution based on ggplot2, take a look at #7195188Wolfson
@PaulHiemstra , thanks but as I mentioned, I'm not looking to make a table because I don't mind how misleading the graph may be (grains of salt will be provided) and, unfortunately, the answer there only mentions that I may be able to use plotrix and axis.break, which I already said that I'm looking into.Phenomenalism
Did you ever figure out how to do this? It doesn't look like this question has been answered and I'm wondering if I need to re-ask it, because I have the same question.Bowing
I
12

You could use the gap.barplot from the plotrix package.

# install.packages('plotrix', dependencies = TRUE)
require(plotrix)

   example(gap.barplot)

or

twogrp<-c(rnorm(10)+4,rnorm(10)+20)
gap.barplot(twogrp,gap=c(8,16),xlab="Index",ytics=c(3,6,17,20),
ylab="Group values",main="Barplot with gap")

Will give you this, example(gap.barplot)

update 2012-05-09 19:15:42 PDT

Would it be an option to use facet_wrap with "free" (or "free_y") scales? That way you would be able to compare the data side by side, but have different y scales

Here is my quick example,

library('ggplot2')

source("http://www.ling.upenn.edu/~joseff/rstudy/data/coins.R")
coins$foo <- ifelse(coins$Mass.g >= 10,  c("Low"), c("hight")) 
m <- ggplot(coins, aes(x = Mass.g)) 
m + geom_histogram(binwidth = 2) + facet_wrap(~ foo, scales = "free")

The above would give you this, enter image description here

Interbreed answered 9/5, 2012 at 0:37 Comment(3)
That's promising and I think it almost answers my question. How can I get it to plot the frequency like a normal histogram? From what I can see, gap.barplot simply plots a bar with a height equal to the value at that Index. Rather than the value, I think I'd like the height to be equal to the frequency of that value.Phenomenalism
@KyleOliveira, would it work if you manually convert your data to frequency and then ploted it? If you supply some sample data it will be easier to demonstrate. Regardless, I do like joran's answer in this threadInterbreed
see the update above. Does that give you a better idea of what I'm going for?Phenomenalism
B
1

This seems to work:

gap.barplot(hdata$counts,gap=c(4000,175000),xlab="Counts",ytics=c(0,3500,175000),
    ylab="Frequency",main="Barplot with gap",xtics=hdata$counts)
Bowing answered 6/8, 2014 at 13:36 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.