Another approach is to make a column in your data frame that determines whether a row should be highlighted and tying the colour aesthetic to that column:
library(tidyverse)
set.seed(47)
mydata =
tibble(
name = c(rep("Phillip", 10), rep("Billip", 2990)),
value_1 = runif(n = 3000, min = 0, max = 5),
value_2 = runif(n = 3000, min = 2, max = 4)) %>%
mutate(hl_phillip = if_else(name == "Phillip", "Phillip", "Not Phillip"))
ggplot(mydata, aes(x = value_1, y = value_2, label = name)) +
geom_text(aes(colour = hl_phillip), fontface = "bold", family = "mono") +
scale_color_manual(values = c("Not Phillip" = "black", "Phillip" = "grey"), guide = FALSE)
This approach also means that your data stays in one data frame, which is especially helpful if you need to highlight data in several different ways!
EDIT: you might also consider plotting only points for the full data set and only plotting text for the Phillips, because geom_text and geom_label can also handle empty strings. I've used this approach before, and it works really well 