Thanks for your example - I am using the separate function to split the labels and then create the label type you want. I also changed to use colour rather than fill for the points.
#by loading the usmap package, you will find the earthquake data
library(usmap)
eq_transformed <- usmap_transform(earthquakes)
# say I want to transform the variable mag to a quartile, and map based on the quartile. note this is not my real data, so the map below will look weird
library(dvmisc)
#> Loading required package: rbenchmark
#> Loading required package: dplyr
#>
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#>
#> filter, lag
#> The following objects are masked from 'package:base':
#>
#> intersect, setdiff, setequal, union
eq_transformed$magqt<-quant_groups(eq_transformed$mag,4)
#> Observations per group: 591, 545, 562, 556. 0 missing.
library(tidyverse)
labelbreaks <- tibble(origlev=levels(eq_transformed$magqt)) %>%
mutate(lev=str_replace_all(origlev, "\\(|\\[|\\]", "")) %>%
separate(lev, into=c("levlow", "levhi"), sep=",", convert=TRUE) %>%
mutate(Label=str_c(levlow, "%-", levhi, "%")) %>%
arrange(levlow)
labelbreaks
#> # A tibble: 4 x 4
#> origlev levlow levhi Label
#> <chr> <dbl> <dbl> <chr>
#> 1 [2.5,2.67] 2.5 2.67 2.5%-2.67%
#> 2 (2.67,2.9] 2.67 2.9 2.67%-2.9%
#> 3 (2.9,3.33] 2.9 3.33 2.9%-3.33%
#> 4 (3.33,7.1] 3.33 7.1 3.33%-7.1%
labels_range <- labelbreaks %>% pull(Label)
ggplot()+
geom_point(data=eq_transformed, aes(x=lon.1, y=lat.1,colour=magqt))+
theme_void()+
scale_colour_manual( values=c("black", "blue", "grey","red"),
labels=labels_range)+
theme(legend.position=c(0.8,0.85),
legend.background = element_blank(),
legend.box.background = element_rect(colour = "black"))

Created on 2020-05-15 by the reprex package (v0.3.0)