2012-09-08 12 views
6

Mam wykres liniowy w ggplot2 i chcę dodać punkty (= kształty) dla każdego wiersza danych, aby jednoznacznie go zidentyfikować. Nie potrzebuję (!) Kształtu/punktu w każdym punkcie danych, ale niektóre wartości będą wystarczające. Zobacz poniższy przykład:ggplot2: Dodaj punkty do geom_line

library(ggplot2) 
library(data.table) 
d=data.table(x=seq(0, 100, by=0.1), y=seq(0,1000))) 
ggplot(d, aes(x=x, y=y))+geom_line() 
ggplot(d, aes(x=x, y=y))+geom_line()+geom_point() 

Line Only With added points

Ze względu na ogromną liczbę próbek, kształty nie są widoczne, ale już overdraw siebie. Potrzebuję tylko niektórych z nich, być może równy odstęp wygląda najlepiej, ale jestem otwarty na każde inne rozwiązanie.

+0

patrz [pytanie] (http://stackoverflow.com/questions/6893959/r-how-do-i-draw-a-line -z-wieloma-strzałkami-w-nim/6904434 # 6904434) aby podzielić linię na punkty o równych odstępach – baptiste

+0

oczywiście odpowiedź powinna zależeć od tego, czy masz prostą linię prostą czy krzywą ścieżkę – baptiste

Odpowiedz

8

Można także dodać kilka punktów, po prostu cienki dane z indeksu.

library(ggplot2) 
library(data.table) 
d=data.table(x=seq(0, 100, by=0.1), y=seq(0,1000)) 
ggplot(d, aes(x=x, y=y))+geom_line() 
#Change the length parameter for fewer or more points 
thinned <- floor(seq(from=1,to=dim(d)[1],length=70)) 
ggplot(d, aes(x=x, y=y))+geom_line()+geom_point(data=d[thinned,],aes(x=x,y=y)) 

enter image description here

5

Można wykreślić punkty w określonych kwantylach za pomocą quantile. Na przykład poniższa sekwencja generuje decyle.

quantile(rnorm(100), probs = seq(0, 1, .1)) 
#   0%   10%   20%   30%   40%   50%   60%   70%   80%   90%  100% 
#-2.43934306 -1.17208001 -0.91497203 -0.69489868 -0.46306926 -0.24133438 -0.03434118 0.39989589 0.72331902 1.06402664 2.02892420 

library(ggplot2) 
library(data.table) 
d <- data.table(x = seq(0, 100, by=0.1), y = seq(0,1000)) 

ggplot(d, aes(x=x, y=y))+ 
geom_line()+ 
geom_point(aes(x = quantile(x, probs = seq(0, 1, .1)), 
       y = quantile(y, probs = seq(0, 1, .1)))) 

Plot with points at deciles

2

Chciałem tylko dodać data.table rozwiązanie, które może pracować z pogrupowanych danych, a także:

library(ggplot2) 
library(data.table) 

# Creates data from the Weibull distribution 
weib_dt <- function(x = seq(0, 4.0, 0.01), w_shape = 1, w_scale = 1) { 
    y = dweibull(x, shape = w_shape, scale = w_scale) 
    data.table("shape" = as.factor(w_shape), "scale" = as.factor(w_scale), "x" = x, "y" = y) 
} 

dt_a <- weib_dt(w_shape = 0.5) 
dt_b <- weib_dt(w_shape = 1.0) 
dt_c <- weib_dt(w_shape = 2.0) 
# Bind multiple Weibull samples together, created from different parametrizations 
dt_merged <- rbindlist(list(dt_a, dt_b, dt_c)) 

# Create the plot, using all the points for the lines, and only 9 points per group for the points. 
ggplot(dt_merged, aes(x, y, group=shape, color=shape)) + 
    coord_cartesian(ylim = c(0, 1.5)) + 
    geom_line() + 
    geom_point(data=dt_merged[, .SD[floor(seq(1, .N, length=9))], by=shape], 
      aes(x, y, group = shape, color = shape, shape = shape)) 

Sztuką jest tu wykorzystanie seq jak z sugerowanych rozwiązań powyżej, ale tym razem odbywa się w grupie (przy użyciu .SD). Zauważ, że obecnie .SD może mieć złą wydajność, możesz użyć bardziej szczegółowego dt[dt[, ..., by =shape]$V1], jeśli jest to powolne.

to stworzy się następujące wyniki:

Weibull plots

Powiązane problemy