2017-01-07 35 views
5

Utworzono wykres liniowy (wykres) w R z etykietami na każdym punkcie danych. Ze względu na dużą liczbę punktów danych fabuła staje się w pełni z etykietami. Chciałbym zastosować etykiety tylko dla ostatnich N (powiedzmy 4) punktów danych. Próbowałem podzbiór i ogon w funkcji geom_label_repel, ale nie był w stanie wymyślić je nasz lub dostał komunikat o błędzie. Mój zbiór danych składa się z 99 wartości, podzielonych na 3 grupy (KPI).R ggplot: Zastosuj etykietę tylko do ostatnich N punktów danych na wykresie

Mam następujący kod w R:

library(ggplot) 
library(ggrepel) 

data.trend <- read.csv(file=....) 

plot.line <- ggplot(data=data.trend, aes(x = Version, y = Value, group = KPI, color = KPI)) + 

    geom_line(aes(group = KPI), size = 1) + 
    geom_point(size = 2.5) + 


    # Labels defined here 
    geom_label_repel(
    aes(Version, Value, fill = factor(KPI), label = sprintf('%0.1f%%', Value)), 
    box.padding = unit(0.35, "lines"), 
    point.padding = unit(0.4, "lines"), 
    segment.color = 'grey50', 
    show.legend = FALSE 
) 

); 

I wszystko uczciwość, jestem zupełnie nowy w R. Może brakuje czegoś podstawowego.

Z góry dziękuję.

+1

Proszę podać odtwarzalny przykład lub przynajmniej pokazać wynikową liczbę. –

Odpowiedz

6

najprostsze podejście jest ustawienie parametru data = w geom_label_repel tylko to punkty, które mają być oznakowane.

Oto powtarzalne przykład:

set.seed(1235) 
data.trend <- data.frame(Version = rnorm(25), Value = rnorm(25), 
         group = sample(1:2,25,T), 
         KPI = sample(1:2,25,T)) 

ggplot(data=data.trend, aes(x = Version, y = Value, group = KPI, color = KPI)) + 
    geom_line(aes(group = KPI), size = 1) + 
    geom_point(size = 2.5) + 
    geom_label_repel(aes(Version, Value, fill = factor(KPI), label = sprintf('%0.1f%%', Value)), 
    data = tail(data.trend, 4),     
    box.padding = unit(0.35, "lines"), 
    point.padding = unit(0.4, "lines"), 
    segment.color = 'grey50', 
    show.legend = FALSE) 

enter image description here

Niestety, ten bałagan nieznacznie z algorytmem odpycha co umieszczanie etykiet nieoptymalne w odniesieniu do innych kwestii, które nie są oznakowane (widać na powyższym rysunku niektóre punkty są objęte etykietami).

Więc lepsze podejście jest użycie color i fill po prostu sprawiają, że niechciane etykiety niewidoczne (poprzez ustawienie zarówno kolor i wypełnić do NA do etykiet, które chcesz ukryć):

ggplot(data=data.trend, aes(x = Version, y = Value, group = KPI, color = KPI)) + 
    geom_line(aes(group = KPI), size = 1) + 
    geom_point(size = 2.5) + 
    geom_label_repel(aes(Version, Value, fill = factor(KPI), label = sprintf('%0.1f%%', Value)), 
        box.padding = unit(0.35, "lines"), 
        point.padding = unit(0.4, "lines"), 
        show.legend = FALSE, 
        color = c(rep(NA,21), rep('grey50',4)), 
        fill = c(rep(NA,21), rep('lightblue',4))) 

enter image description here

+0

Dzięki, postawiłeś mnie we właściwym kierunku. Jednak widzę, że pokazane są tylko ostatnie punkty danych z 1 linii. Aby temu zaradzić, dodałem listę z Wersjami, które chcę wydrukować i użyć podzestawu w polu danych, aby je wyświetlić. To miesza funkcję odpychania, ale w moim przypadku nie stanowi to problemu. Wielkie dzięki! 'etykiety <- ogon (data.trend $ wersja 3) ..... geom_label_repel ( danych = podzbiór (data.trend, data.trend $ wersji% w% etykiet), AES (wersja, Wartość, wypełnienie = współczynnik (KPI), etykieta = sprintf ('% 0.1f %%', Wartość)), ... ) ' – user32556