2012-06-05 13 views
5

Mam działkę, na której chciałbym narysować linię od (0,0) do (15,15), z legendą. Jak to osiągnąć? Działki:narysuj linię w poprzek w ggplot2

frame <- read.table('pastie_from_web', sep=",", header=TRUE) 
colnames(frame) <- c("pos", "word.length") 
plot <- ggplot(frame, aes(x=pos, y=word.length)) + scale_x_continuous(limits=c(1,15)) + scale_y_continuous(limits=c(1,15))+ geom_density2d(aes(color=..level..)) + scale_color_gradient(low="black", high="red") + opts(legend.position="none") 
png(paste("graphs/", fname, ".png", sep=""), width=600, height=600) 
print(plot) 

danych: http://sprunge.us/gKiL lub

structure(list(position = c(2, 2, 2, 2, 7, 8, 4, 5, 4, 9, 5, 
2, 7, 9, 9, 6, 5, 6, 9, 2, 6, 5, 5, 7, 7, 5, 6, 5, 5, 3, 2, 4, 
5, 2, 3, 2, 7, 5, 2, 5, 2, 6, 8, 7, 2, 8, 5, 4, 2, 5, 2, 2, 2, 
6, 8, 2, 2, 9, 5, 2, 4, 7, 3, 4, 9, 5, 5, 5, 5, 4, 7, 2, 7, 2, 
4, 4, 3, 2, 5, 6, 5, 5, 5, 5, 4, 4, 8, 7, 5, 7, 4, 3, 4, 5, 2, 
6, 6, 4, 4, 2, 2, 3, 2, 2, 6, 2), word.length = c(5L, 5L, 6L, 
4L, 9L, 11L, 5L, 8L, 8L, 10L, 8L, 9L, 8L, 10L, 10L, 7L, 9L, 10L, 
11L, 10L, 10L, 8L, 13L, 11L, 11L, 13L, 7L, 9L, 6L, 4L, 9L, 8L, 
9L, 6L, 4L, 5L, 11L, 13L, 13L, 13L, 10L, 9L, 11L, 8L, 4L, 10L, 
8L, 16L, 3L, 5L, 4L, 12L, 12L, 15L, 9L, 12L, 12L, 11L, 11L, 8L, 
16L, 9L, 8L, 7L, 10L, 11L, 6L, 13L, 5L, 8L, 8L, 5L, 8L, 5L, 6L, 
6L, 7L, 10L, 13L, 7L, 6L, 13L, 9L, 6L, 7L, 8L, 11L, 8L, 8L, 8L, 
8L, 8L, 7L, 6L, 5L, 9L, 9L, 5L, 5L, 6L, 7L, 8L, 8L, 10L, 8L, 
10L)), .Names = c("position", "word.length"), class = "data.frame", row.names = c(NA, 
-106L)) 
+0

Proszę użyć 'dput (danych)' i wkleić ten wynik (lub jego część 'dput (head (dane))') zamiast publikować dane gdzie indziej w Internecie. – Maiasaura

+2

być może 'geom_segment (aes (x = 0, y = 0, xend = 15, yend = 15))'. Nie jest jasne, co pokazujesz w legendzie. – Chase

+0

Co powiedział @Maiasaura lub jeśli nie chcesz "dput()" tutaj, pokaż co najmniej kod służący do odczytu tego pliku z sieci, abyśmy nie musieli tego sami wymyślać. –

Odpowiedz

5

Oto przykład zbiór danych, które przedstawiają:

set.seed(42) 
dat <- data.frame(x = runif(20, min = 0, max = 20), 
        y = runif(20, min = 0, max = 20)) 

p <- ggplot(dat, aes(x = x, y = y)) 
p + geom_point() + 
    geom_line(data = data.frame(x = c(0,15), y = c(0,15)), 
       aes = aes(x = x, y = y), colour = "red") 

Wskazówki w jaki sposób możemy określić inną data argument geoms, który pozwala nam do wykreślania różnych obiektów danych na tych samych obszarach wykresów zdefiniowanych w oryginalnym wywołaniu ggplot(). Uwaga: Jeśli druga ramka danych (w rozmowie geom_line()) ma to samo odwzorowanie osi X i Y co oryginalny wykres, to nie potrzebujesz nowego aes(), ponieważ pierwotnie miałem kod (zobacz historię zmian odpowiedzi)). To mogło nie być jasne, a komentarz od @Justin skłonił mnie do zmiany geom_line(), aby dołączyć nowe wywołanie aes() do mapowania danych do estetyki; nie jest potrzebny na moim przykładzie, ale może być potrzebny w rzeczywistym świecie.

Powyższe daje:

enter image description here

Jeśli chcesz różnych dowolnych wierszy, należy rozważyć geom_abline() do rysowania linii o nachyleniu dawać i przecięcia. geom_segment() jest alternatywą dla powyższej geom_line(), w której określa się współrzędne początkowe i końcowe xiy. Zobacz odpowiednie strony pomocy dla geomów, aby określić, które preferujesz.

+0

Dodałem 'plot <- plot + geom_line (data = data.frame (x = c (0,15), y = c (0,15)), kolor =" zielony ")' do pliku, który daje mi 'Błąd w eval (expr, envir, enclos): nie znaleziono obiektu" pos " Połączenia: lapply ... sapply -> lapply -> eval.quoted -> lapply -> FUN -> eval'. – Reactormonk

+2

nie dostarczyłeś nowego 'aes (...)' dla 'geom_line', więc próbuje użyć tego zdefiniowanego w pierwszym' ggplot'. Zamiast tego dodaj odpowiednie "aes", jak w odpowiedzi Gavina, lub zmień nazwy pasujących danych "geom_line" data.frame. – Justin

+0

+1 Dobry punkt @Justin Nie dodałem nowego 'aes (...)' w wywołaniu 'geom_line()' ponieważ * odwzorowanie zmiennej 'x' na oś X i' y' na oś y pozostała taka sama jak początkowa 'ggplot()' ale może nie być jasna. Zmienię powyższy kod, aby to odzwierciedlić. –

Powiązane problemy