Why, in a grouped discrete data starting with zero, does the lower boundary start by -0.5? My statistics book states that:

Special care must be taken with class boundaries when drawing a histogram to represent grouped discrete data.....a continuous scale is used.


Consider the group 0-9. Although it may seem strange, when data are discrete, the lower boundary is taken as — 0.5 and the group 0—9 is represented on a histogram by the interval from —0.5 to 9.5.

It's really confusing to why we have to use a continuous scale with discrete data, can't we just use a histogram but leave a gap between say 9 and the number after it to show that's there's a new interval coming? Second, why do we make the zero negative 0.5
 A: Bar Plots Preferred to Histograms for Graphical Display of  Ordinal Categorical Data
Comment continued with an example:
Here are some 7-category Likert scores simulated, summarized, and graphed
in R. Data need to be tabulated for a barplot in R, and histogram
cutpoints separating bins need to be specified in order to make a useful histogram.
For categorical data, barplots are the preferred graphical display. Spaces between bars emphasize the discreteness of ordinal
categorical values. Histogram bars that touch may give the impression that data have continuous numerical values.
Generate data:
set.seed(2020)           # for reproducibility
prop = c(1,2,3,4,3,3,2)  # proportions for scores; need not add to 1
x = sample(1:7, 100, rep=T, p = prop)  # samples data

Describe data:
table
x
 1  2  3  4  5  6  7     # scores
 6  8 20 21 18 16 11     # frequencies

quantile(x)
  0%  25%  50%  75% 100% 
   1    3    4    6    7 

Graph data:
par(mfrow=c(1,2))          # enables two panels per plot
 farb = c("maroon", "red", "orange", "khaki", 
          "green3", "cyan3", "skyblue")  # optional colors
 tab.x = tabulate(x)       # tabulate data for plot
 barplot(tab.x, names.arg=1:7, col=farb, 
         main="Barplot of Likert Scores")

 cutp = seq(.5, 7.5, by=1) # cut points for histogram bins
 hist(x, br=cutp, col="skyblue2", 
      main="'Histogram' of Likert Scores")
par(mfrow=c(1,1))          # return to single-panel plots


