Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ggplot: text printed by geom_text is not clear

Tags:

r

ggplot2

The text printed using geom_text is not very clear. How can I make it more clear?

data = data.frame(rnorm(1000))
colnames(data) = "numOfX"
m <- ggplot(data, aes(x=numOfX))
m + geom_histogram(colour = "blue", fill = "white", binwidth = 0.5) +
  annotate("segment", x=10,xend=10,y=20,yend=0,arrow=arrow(), color="blue") +
  geom_text(aes(10, 30, label="Observed \n value"), color = "blue") 

enter image description here

like image 229
learner Avatar asked Jul 23 '12 18:07

learner


2 Answers

Use annotate for the text as well as the arrow:

m + geom_histogram(colour = "blue", fill = "white", binwidth = 0.5) +
  annotate("segment", x=10,xend=10,y=20,yend=0,arrow=arrow(), color="blue") +
  annotate("text", x=10, y=30, label="Observed \n value", color = "blue")

enter image description here


The reason is that geom_text overplots the text for each row of data in the data frame, whereas annotate plots the text only once. It is this overplotting that causes the bold, pixellated text.

I am sure this question was answered recently. I'll try to find a reference: A similar question was asked recently:

  • ggplot2: Is there a fix for jagged, poor-quality text produced by geom_text()?
  • How to nicely annotate a ggplot2 (manual)
like image 143
Andrie Avatar answered Nov 15 '22 11:11

Andrie


Expanding on Dave Gruenewald's comment, geom_text now has the check_overlap option. See the tidyverse reference:

check_overlap -- If TRUE, text that overlaps previous text in the same layer will not be plotted. check_overlap happens at draw time and in the order of the data. Therefore data should be arranged by the label column before calling geom_text(). Note that this argument is not supported by geom_label().

library(ggplot2)
data = data.frame(rnorm(1000))
colnames(data) = "numOfX"
m <- ggplot(data, aes(x=numOfX))
m + geom_histogram(colour = "blue",
                   fill = "white",
                   binwidth = 0.5) +
  annotate("segment",
           x = 10, xend = 10,
           y = 20, yend = 0,
           arrow = arrow(), color="blue") +
  geom_text(aes(10, 30, label="Observed \n value"),
            color = "blue", check_overlap = T)

enter image description here

like image 35
acvill Avatar answered Nov 15 '22 11:11

acvill