How to nicely annotate a ggplot2 (manual)
Using ggplot2
I normally use geom_text
and something like position=jitter
to annotate my plots.
However - for a nice plot I often finds it worthwhile to annotate manually. like below:
data2 <- structure(list(type = structure(c(5L, 1L, 2L, 4L, 3L, 5L, 1L,
2L, 4L, 3L, 5L, 1L, 2L, 4L, 3L, 5L, 1L, 2L, 4L, 3L), .Label = c("EDS",
"KIU", "LAK", "MVH", "NA*"), class = "factor"), value = c(0.9,
0.01,开发者_运维知识库 0.01, 0.09, 0, 0.8, 0.05, 0, 0.15, 0, 0.41, 0.04, 0.03,
0.52, 0, 0.23, 0.11, 0.02, 0.64, 0.01), time = c(3L, 3L, 3L,
3L, 3L, 6L, 6L, 6L, 6L, 6L, 15L, 15L, 15L, 15L, 15L, 27L, 27L,
27L, 27L, 27L), year = c(2008L, 2008L, 2008L, 2008L, 2008L, 2007L,
2007L, 2007L, 2007L, 2007L, 2007L, 2007L, 2007L, 2007L, 2007L,
2006L, 2006L, 2006L, 2006L, 2006L)), .Names = c("type", "value",
"time", "year"), row.names = c(1L, 3L, 4L, 5L, 6L, 7L, 9L, 10L,
11L, 12L, 13L, 15L, 16L, 17L, 18L, 19L, 21L, 22L, 23L, 24L), class = "data.frame")
ggplot(data2, aes(x=time, y=value, group=type, col=type))+
geom_line()+
geom_point()+
theme_bw()+
annotate("text", x=6, y=0.9, label="this is a wrong color")+
annotate("text", x=15, y=0.6, label="this is a second annotation with a wrong color")
The problem is, that I can't get the text annotations color to match the line color. I assume I could fix this with a manual scale, but I hope there is a better way?
I had a similar problem and solved it with JD Long answer. But as a results of ggplot2
updating to version 0.9.0 I noticed that all geom_text()
calls rendered somewhat blurred on the plots.
Thanks to kohske I discovered that this code
ggplot(data2, aes(x=time, y=value, group=type, col=type))+
geom_line()+
geom_point()+
theme_bw() +
geom_text(aes(7, .9, label="correct color", color="NA*")) +
geom_text(aes(15, .6, label="another correct color!", color="MVH"))
plots the geom_text nrow(data2)
times!
The correct way for supplying data to geom_text is building a different data.frame holding coordinates, labels and colors for the strings you want to be plotted:
data2.labels <- data.frame(
time = c(7, 15),
value = c(.9, .6),
label = c("correct color", "another correct color!"),
type = c("NA*", "MVH")
)
ggplot(data2, aes(x=time, y=value, group=type, col=type))+
geom_line()+
geom_point()+
theme_bw() +
geom_text(data = data2.labels, aes(x = time, y = value, label = label))
If you use geom_text() instead of annotate() you can pass a group color to your plot:
ggplot(data2, aes(x=time, y=value, group=type, col=type))+
geom_line()+
geom_point()+
theme_bw() +
geom_text(aes(7, .9, label="correct color", color="NA*")) +
geom_text(aes(15, .6, label="another correct color!", color="MVH"))
So using annotate() it looks like this: alt text http://www.cerebralmastication.com/wp-content/uploads/2010/03/before.png
then after using geom_text() it looks like this: alt text http://www.cerebralmastication.com/wp-content/uploads/2010/03/after.png
These days there are packages adding labeling:
- geom_dl from the directlabel package with automatic data filtering to avoid repeated labels and
- geom_label_repel and geom_text_repel from package ggrepel make labels that try to avoid sitting on top of the data or each other and which in the case of geom_label_repel have a boundary and a non-transparant background.
精彩评论