2011-10-24 15 views
5

Mam działkę geom_area, która wygląda tak: area plotJak wypełnić wykres geom_area() za pomocą polecenia ggplot?

Chcę kolorować wszystko powyżej osi x zieleni i wszystko poniżej osi X czerwony. Mam w moich danych kolumnę kategorii, która zawiera ciąg "pozytywny" dla wszystkich wartości dodatnich i "ujemny" dla wszystkich wartości ujemnych, więc próbowałem po prostu zrobić wypełnienie = kategorię i używając scale_fill_manual, aby ustawić dodatni na zielony, a negatywny na czerwony, ale to daje mi to: colored area plot

Zielony powyżej x wygląda dobrze, ale czerwony poniżej osi jest nieprawidłowy. Sprawdziłem swoje dane i nie ma ujemnych punktów danych, w których koloruje się na czerwono po 20 października, a zamiast tego używam geom_point, a otrzymuję poprawne kolory.

Oto próbka moich danych:

created     score category 
2011-10-19 21:26:19  2 positive 
2011-10-19 22:50:33 -2 negative 
2011-10-20 15:12:38 -2 negative 
2011-10-20 17:19:24 -2 negative 
2011-10-20 22:12:44  2 positive 
2011-10-20 22:16:57  4 positive 
2011-10-21 08:22:53  2 positive 

i tu jest kod używam do działki:

ggplot(data = df, aes(x = created, y = score, colour = category)) + geom_point(aes(fill = category)) + scale_fill_manual(values = c("positive" = "green", "negative" = "red"))

Mój problem może być związany z this previous question.

+2

[To] (http://learnr.wordpress.com/2009/10/22/ggplot2- dwukolorowy-obszar-mapy-kombi/# more-2195) blog może pomóc. – joran

Odpowiedz

7

Należy utworzyć nową zmienną grupującą dla każdego segmentu dodatniego/ujemnego. Aby dokonać przejścia mniej "topornie", można po prostu pierwszy interpolacji danych:

require(ggplot2) 

# Load data 
df = read.table('data.txt', header=T) 
df$created = as.POSIXct(df$created, tz='UTC') 

# Interpolate data 
lin_interp = function(x, y, length.out=100) { 
    approx(x, y, xout=seq(min(x), max(x), length.out=length.out))$y 
} 
created.interp = lin_interp(df$created, df$created) 
created.interp = as.POSIXct(created.interp, origin='1970-01-01', tz='UTC') 
score.interp = lin_interp(df$created, df$score) 
df.interp = data.frame(created=created.interp, score=score.interp) 

# Make a grouping variable for each pos/neg segment 
cat.rle = rle(df.interp$score < 0) 
df.interp$group = rep.int(1:length(cat.rle$lengths), times=cat.rle$lengths) 

# Plot 
dev.new(width=6, height=4) 
ggplot(data = df.interp, aes(x = created, y = score, fill=score>0, group=group)) + geom_area() + scale_fill_manual(values = c('green', 'red')) 

enter image description here

+0

BTW Przytoczyłem kolumnę 'created' na podstawie przykładowych danych, aby ułatwić ładowanie. –

+0

Działa dla mnie! Rle to także całkiem nowa sztuczka. –

+0

@WilliamGunn Świetnie, cieszę się, że zadziałało. Właśnie dowiedziałem się o rle, ja. :) –

Powiązane problemy