Plotting Concepts
Histogram
Choosing Bins
Histograms group numeric values into intervals. Wider breaks combine more values into each bin.
Program
Play the script to change break width and see which histogram bin receives the most values.
histogram_bins.R
Replay: real traced execution (multi-file project)
values <- c(2, 4, 4, 5, 7, 8, 9, 10)
break_width <- 2
breaks <- seq(0, 12, by = break_width)
histogram <- hist(values, breaks = breaks, plot = FALSE)
counts <- histogram$counts
labels <- paste(head(breaks, -1), tail(breaks, -1), sep = "-")
peak <- labels[which.max(counts)]
cat(peak, "\n", sep = "")
values <- c(2, 4, 4, 5, 7, 8, 9, 10)
break_width <- 3
breaks <- seq(0, 12, by = break_width)
histogram <- hist(values, breaks = breaks, plot = FALSE)
counts <- histogram$counts
labels <- paste(head(breaks, -1), tail(breaks, -1), sep = "-")
peak <- labels[which.max(counts)]
cat(peak, "\n", sep = "")
values <- c(2, 4, 4, 5, 7, 8, 9, 10)
break_width <- 4
breaks <- seq(0, 12, by = break_width)
histogram <- hist(values, breaks = breaks, plot = FALSE)
counts <- histogram$counts
labels <- paste(head(breaks, -1), tail(breaks, -1), sep = "-")
peak <- labels[which.max(counts)]
cat(peak, "\n", sep = "")
values ← 2, 4, 4, 5, 7, 8, 9, 10
1values <- c(2, 4, 4, 5, 7, 8, 9, 10)2break_width <- 2values this step2, 4, 4, 5, 7, 8, 9, 10valuesbreak_width ← 2
1values <- c(2, 4, 4, 5, 7, 8, 9, 10)2break_width <- 23breaks <- seq(0, 12, by = break_width)values this step2break_widthbreaks ← 0, 2, 4, 6, 8, 10, 12
2break_width <- 23breaks <- seq(0, 12, by = break_width)4histogram <- hist(values, breaks = breaks, plot = FALSE)values this step0, 2, 4, 6, 8, 10, 12breaks2break_widthhistogram ← computed without drawing
3breaks <- seq(0, 12, by = break_width)4histogram <- hist(values, breaks = breaks, plot = FALSE)5counts <- histogram$countsvalues this stepcomputed without drawinghistogram8 numbersvalues6 intervalsbreakscounts ← 6 bins
4histogram <- hist(values, breaks = breaks, plot = FALSE)5counts <- histogram$counts6labels <- paste(head(breaks, -1), tail(breaks, -1), sep = "-")values this step6 binscountslabels ← 0-2, 2-4, 4-6, 6-8, 8-10, 10-12
5counts <- histogram$counts6labels <- paste(head(breaks, -1), tail(breaks, -1), sep = "-")7peak <- labels[which.max(counts)]values this step0-2, 2-4, 4-6, 6-8, 8-10, 10-12labels0, 2, 4, 6, 8, 10, 12breakspeak ← 2-4
6labels <- paste(head(breaks, -1), tail(breaks, -1), sep = "-")7peak <- labels[which.max(counts)]8cat(peak, "\n", sep = "")values this step2-4peak1, 2, 1, 2, 2, 0countscat(peak, " ", sep = "")
7peak <- labels[which.max(counts)]8cat(peak, "\n", sep = "")output2-4values this step2-4peak
values ← 2, 4, 4, 5, 7, 8, 9, 10
1values <- c(2, 4, 4, 5, 7, 8, 9, 10)2break_width <- 3values this step2, 4, 4, 5, 7, 8, 9, 10valuesbreak_width ← 3
1values <- c(2, 4, 4, 5, 7, 8, 9, 10)2break_width <- 33breaks <- seq(0, 12, by = break_width)values this step3break_widthbreaks ← 0, 3, 6, 9, 12
2break_width <- 33breaks <- seq(0, 12, by = break_width)4histogram <- hist(values, breaks = breaks, plot = FALSE)values this step0, 3, 6, 9, 12breaks3break_widthhistogram ← computed without drawing
3breaks <- seq(0, 12, by = break_width)4histogram <- hist(values, breaks = breaks, plot = FALSE)5counts <- histogram$countsvalues this stepcomputed without drawinghistogram8 numbersvalues4 intervalsbreakscounts ← 4 bins
4histogram <- hist(values, breaks = breaks, plot = FALSE)5counts <- histogram$counts6labels <- paste(head(breaks, -1), tail(breaks, -1), sep = "-")values this step4 binscountslabels ← 0-3, 3-6, 6-9, 9-12
5counts <- histogram$counts6labels <- paste(head(breaks, -1), tail(breaks, -1), sep = "-")7peak <- labels[which.max(counts)]values this step0-3, 3-6, 6-9, 9-12labels0, 3, 6, 9, 12breakspeak ← 3-6
6labels <- paste(head(breaks, -1), tail(breaks, -1), sep = "-")7peak <- labels[which.max(counts)]8cat(peak, "\n", sep = "")values this step3-6peak1, 3, 3, 1countscat(peak, " ", sep = "")
7peak <- labels[which.max(counts)]8cat(peak, "\n", sep = "")output3-6values this step3-6peak
values ← 2, 4, 4, 5, 7, 8, 9, 10
1values <- c(2, 4, 4, 5, 7, 8, 9, 10)2break_width <- 4values this step2, 4, 4, 5, 7, 8, 9, 10valuesbreak_width ← 4
1values <- c(2, 4, 4, 5, 7, 8, 9, 10)2break_width <- 43breaks <- seq(0, 12, by = break_width)values this step4break_widthbreaks ← 0, 4, 8, 12
2break_width <- 43breaks <- seq(0, 12, by = break_width)4histogram <- hist(values, breaks = breaks, plot = FALSE)values this step0, 4, 8, 12breaks4break_widthhistogram ← computed without drawing
3breaks <- seq(0, 12, by = break_width)4histogram <- hist(values, breaks = breaks, plot = FALSE)5counts <- histogram$countsvalues this stepcomputed without drawinghistogram8 numbersvalues3 intervalsbreakscounts ← 3 bins
4histogram <- hist(values, breaks = breaks, plot = FALSE)5counts <- histogram$counts6labels <- paste(head(breaks, -1), tail(breaks, -1), sep = "-")values this step3 binscountslabels ← 0-4, 4-8, 8-12
5counts <- histogram$counts6labels <- paste(head(breaks, -1), tail(breaks, -1), sep = "-")7peak <- labels[which.max(counts)]values this step0-4, 4-8, 8-12labels0, 4, 8, 12breakspeak ← 0-4
6labels <- paste(head(breaks, -1), tail(breaks, -1), sep = "-")7peak <- labels[which.max(counts)]8cat(peak, "\n", sep = "")values this step0-4peak3, 3, 2countscat(peak, " ", sep = "")
7peak <- labels[which.max(counts)]8cat(peak, "\n", sep = "")output0-4values this step0-4peak
hist
`hist(..., plot = FALSE)` computes bins and counts without drawing a chart.
breaks
`breaks` defines the interval boundaries used by the histogram.
which.max
`which.max(counts)` selects the first bin with the largest count.