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.

break_width
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 = "")
  1. values ← 2, 4, 4, 5, 7, 8, 9, 10

    1values <- c(2, 4, 4, 5, 7, 8, 9, 10)2break_width <- 2
    values this step2, 4, 4, 5, 7, 8, 9, 10values
  2. break_width ← 2

    1values <- c(2, 4, 4, 5, 7, 8, 9, 10)2break_width <- 23breaks <- seq(0, 12, by = break_width)
    values this step2break_width
  3. breaks ← 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_width
  4. histogram ← computed without drawing

    3breaks <- seq(0, 12, by = break_width)4histogram <- hist(values, breaks = breaks, plot = FALSE)5counts <- histogram$counts
    values this stepcomputed without drawinghistogram8 numbersvalues6 intervalsbreaks
  5. counts ← 6 bins

    4histogram <- hist(values, breaks = breaks, plot = FALSE)5counts <- histogram$counts6labels <- paste(head(breaks, -1), tail(breaks, -1), sep = "-")
    values this step6 binscounts
  6. labels ← 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, 12breaks
  7. peak ← 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, 0counts
  8. cat(peak, " ", sep = "")

    7peak <- labels[which.max(counts)]8cat(peak, "\n", sep = "")
    output2-4
    values this step2-4peak
  1. values ← 2, 4, 4, 5, 7, 8, 9, 10

    1values <- c(2, 4, 4, 5, 7, 8, 9, 10)2break_width <- 3
    values this step2, 4, 4, 5, 7, 8, 9, 10values
  2. break_width ← 3

    1values <- c(2, 4, 4, 5, 7, 8, 9, 10)2break_width <- 33breaks <- seq(0, 12, by = break_width)
    values this step3break_width
  3. breaks ← 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_width
  4. histogram ← computed without drawing

    3breaks <- seq(0, 12, by = break_width)4histogram <- hist(values, breaks = breaks, plot = FALSE)5counts <- histogram$counts
    values this stepcomputed without drawinghistogram8 numbersvalues4 intervalsbreaks
  5. counts ← 4 bins

    4histogram <- hist(values, breaks = breaks, plot = FALSE)5counts <- histogram$counts6labels <- paste(head(breaks, -1), tail(breaks, -1), sep = "-")
    values this step4 binscounts
  6. labels ← 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, 12breaks
  7. peak ← 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, 1counts
  8. cat(peak, " ", sep = "")

    7peak <- labels[which.max(counts)]8cat(peak, "\n", sep = "")
    output3-6
    values this step3-6peak
  1. values ← 2, 4, 4, 5, 7, 8, 9, 10

    1values <- c(2, 4, 4, 5, 7, 8, 9, 10)2break_width <- 4
    values this step2, 4, 4, 5, 7, 8, 9, 10values
  2. break_width ← 4

    1values <- c(2, 4, 4, 5, 7, 8, 9, 10)2break_width <- 43breaks <- seq(0, 12, by = break_width)
    values this step4break_width
  3. breaks ← 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_width
  4. histogram ← computed without drawing

    3breaks <- seq(0, 12, by = break_width)4histogram <- hist(values, breaks = breaks, plot = FALSE)5counts <- histogram$counts
    values this stepcomputed without drawinghistogram8 numbersvalues3 intervalsbreaks
  5. counts ← 3 bins

    4histogram <- hist(values, breaks = breaks, plot = FALSE)5counts <- histogram$counts6labels <- paste(head(breaks, -1), tail(breaks, -1), sep = "-")
    values this step3 binscounts
  6. labels ← 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, 12breaks
  7. peak ← 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, 2counts
  8. cat(peak, " ", sep = "")

    7peak <- labels[which.max(counts)]8cat(peak, "\n", sep = "")
    output0-4
    values 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.