2016-12-09 5 views
0

Gibt es eine Möglichkeit, einen eigenen Linientyp in ggplot zu definieren? In einem Liniendiagramm möchte ich die Zeilen als kleine Zahlen angezeigt werden. Ein bisschen wie Linientyp "gepunktete" nur mit kleinen "1" oder "2" anstelle der Punkte. Ich habe es mit Etiketten versucht, aber sie zeigen nur an den definierten Punkten und nicht in den Zwischenräumen. Und ich kann es nicht herausfinden konnte, wie es implementieren in scale_linetype_manualGibt es eine Möglichkeit, selbstdefinierte Linientypen in ggplot zu verwenden

df <- data.frame(
    x = runif(10), 
    y = runif(10), 
    z = c(1,1,1,1,1,2,2,2,2,2)) 

ggplot(df, aes(x, y)) + 
    geom_line(aes(colour=as.factor(z), linetype = as.factor(z)))+ 
    geom_text(aes(label=z)) 
+1

Sie höchstwahrscheinlich können tue das nicht mit 'geom_line' mit' linetype'. Sie könnten mehr Werte interpolieren und 'geom_text' verwenden. – Axeman

Antwort

1

Sie versuchen this strategy Anpassung könnte Pfade in gleichem Abstand Segmente aufzuteilen,

enter image description here

set.seed(123) 
df <- data.frame(
    x = runif(10), 
    y = runif(10), 
    z = c(1,1,1,1,1,2,2,2,2,2)) 

parametric_smoothie <- function(x, y, sort = TRUE, N=1e2, phase=1, offset=0) { 

    if(sort){ 
    ox <- order(x) 
    x <- x[ox] 
    y <- y[ox] 
    } 

    lengths <- c(0, sqrt(diff(x)^2 + diff(y)^2)) 
    l <- cumsum(lengths) 
    lmax <- max(l) 
    newpos <- seq(phase*lmax/N, lmax-phase*lmax/N, length.out = N) + offset*lmax/N 
    xx <- approx(l, x, newpos)$y 
    yy <- approx(l, y, newpos)$y 

    ## new points, equi-spaced 
    dnew <- data.frame(x = xx, y = yy) 

    xx <- c(x, xx) 
    yy <- c(y, yy) 
    ox <- order(xx) 
    xx <- xx[ox] 
    yy <- yy[ox] 

    ## original and new points combined 
    dcomb <- data.frame(x = xx, y = yy) 

    list(dnew = dnew, dcomb = dcomb) 
} 

dl <- plyr::dlply(df, "z", function(.d) parametric_smoothie(.d$x, .d$y, N=10)) 

df2 <- plyr::ldply(dl, "[[", "dnew") 
df3 <- plyr::ldply(dl, "[[", "dcomb") 

ggplot(df, aes(x, y)) + 
    geom_line(data = df3, aes(colour=as.factor(z))) + 
    geom_point(data = df2, colour = "grey92", size=5) + 
    geom_point(aes(colour=as.factor(z))) + 
    geom_text(data = df2, aes(label=z), size=3) 
+0

Vielen Dank! Es funktioniert gut – user3845433

+0

@ user3845433 in Betracht ziehen, die Antwort anzunehmen/upvoting – baptiste

Verwandte Themen