Più di sei forme in ggplot

Vorrei trama di linee e di forme diverse, con più di sei insiemi di dati, l’utilizzo di colori discreti. I problemi sono: 1) una diversa leggenda è generato per colore e forma, ma dovrebbe essere solo una leggenda con la linea, il colore e la forma, 2) quando si corregge il titolo per la linea e la leggenda dei colori, il colore di scomparire.

t=seq(0,360,20)
for (ip in seq(0,10)) {
  if (ip==0) {
    df<-data.frame(t=t,y=sin(t*pi/180)+ip/2,sn=ip+100)
  } else {
    tdf<-data.frame(t=t,y=sin(t*pi/180)+ip/2,sn=ip+100)
    df<-rbind(df,tdf)

  }
}
head(df)

# No plot
# Error: A continuous variable can not be mapped to shape
gp <- ggplot(df,aes(x=t,y=y,group=sn,color=sn,shape=sn))
gp <- gp + labs(title = "Demo more than 6 shapes", x="Theat (deg)", y="Magnitude")
gp <- gp + geom_line() + geom_point()
print(gp)

# No plot
# Error: A continuous variable can not be mapped to shape (doesn't like integers)
gp <- ggplot(df,aes(x=t,y=y,group=sn,color=sn,shape=as.integer(sn)))
gp <- gp + labs(title = "Demo more than 6 shapes", x="Theat (deg)", y="Magnitude")
gp <- gp + geom_line() + geom_point()
print(gp)

# Gives warning about 6 shapes, and only shows 6 shapes, continous sn colors
gp <- ggplot(df,aes(x=t,y=y,group=sn,color=sn,shape=as.factor(sn)))
gp <- gp + labs(title = "Only shows six shapes, and two legends, need discrete colors", 
                x="Theat (deg)", y="Magnitude")
gp <- gp + geom_line() + geom_point()
print(gp)

# This is close to what is desired, but correct legend title and combine legends
gp <- ggplot(df,aes(x=t,y=y,group=sn,color=as.factor(sn),shape=as.factor(sn %% 6)))
gp <- gp + labs(title = "Need to combine legends and correct legend title", x="Theat (deg)", y="Magnitude")
gp <- gp + geom_line() + geom_point()
print(gp)

# Correct legend title, but now the line color disappears
gp <- ggplot(df,aes(x=t,y=y,group=sn,color=as.factor(sn),shape=as.factor(sn %% 6)))
gp <- gp + labs(title = "Color disappeard, but legend title changed", x="Theat (deg)", y="Magnitude")
gp <- gp + geom_line() + geom_point()
gp <- gp + scale_color_manual("SN",values=as.factor(df$sn)) 
print(gp)

# Add color and shape in geom_line /geom_point commands, 
gp <- ggplot(df,aes(x=t,y=y,group=sn))
gp <- gp + labs(title = "This is close, but legend symbols are wrong", x="Theat (deg)", y="Magnitude")
gp <- gp + geom_line(aes(color=as.factor(df$sn))) 
gp <- gp + geom_point(color=as.factor(df$sn),shape=as.factor(df$sn %% 6))
gp <- gp + scale_color_manual("SN",values=as.factor(df$sn)) 
print(gp)
InformationsquelleAutor user3969377 | 2014-10-06



3 Replies
  1. 43

    Prima, sarebbe più facile per convertire sn di un fattore.

    df$sn <- factor(df$sn)

    Quindi, è necessario utilizzare scale_shape_manual per specificare le forme di utilizzo.

    gp <- ggplot(df,aes(x=t, y=y, group=sn,color=sn, shape=sn)) +
                 scale_shape_manual(values=1:nlevels(df$sn)) +
                 labs(title = "Demo more than 6 shapes", x="Theat (deg)", y="Magnitude") +
                 geom_line() + 
                 geom_point(size=3)
    gp

    Questo dovrebbe darti quello che vuoi. È necessario utilizzare scale_shape_manual perché, anche con sn come un fattore, ggplot sarà solo aggiungere fino a 6 diversi simboli automaticamente. Dopo di che è necessario specificare manualmente. Si possono cambiare i simboli in un numero di modi. Date un’occhiata a queste pagine per ulteriori informazioni su come: http://sape.inf.usi.ch/quick-reference/ggplot2/shape

    http://www.cookbook-r.com/Graphs/Shapes_and_line_types/

    Più di sei forme in ggplot

    • Questo è più vicino, ma non abbastanza lavoro su dati reali. Ho ancora bisogno di mod funzione, i dati reali ha troppi livelli. Sembra che scale_shape_manual(valori=(1:nlivelli(df$sn))%%Nmax) funziona.
    • Dove Nmax è il numero di forme di visualizzazione.
    • Nell’ultimo esempio del primo link che ho incluso, racconta un po ‘ di più le forme disponibili. Si noti che le forme 21-25 sono cave e prendere un fill argomento, in modo che sarebbe un altro modo per aggiungere simboli distintivi. Buon lavoro di ordinamento della soluzione.
    • Questo è esattamente quello che stavo cercando. Grazie mille @Cotone.Rockwood
  2. 7

    Per me, la chiave per il messaggio di errore di circa il 6 forme è la parte che dice Consider specifying shapes manually..

    Se si aggiunge il values in scale_shape_manual, credo che si otterrà ciò che si desidera. Ho fatto sn un fattore dataset prima.

    df$sn = factor(df$sn)
    
    ggplot(df, aes(x = t, y = y, group = sn, color = sn, shape = sn)) +
        geom_point() +
        geom_line() +
        scale_shape_manual(values = 0:10)

    Vado al Ricettario per R quando ho bisogno di ricordare a quali numeri corrispondono forme.

    Modifica L’esempio sopra mostra l’aggiunta di 11 simboli, lo stesso numero di simboli nell’esempio del set di dati. I tuoi commenti indicare che si dispone di molti più valori univoci per la sn variabile che nel tuo esempio. Fate attenzione con l’utilizzo di una lunga serie di numeri in values, come non tutti i numeri sono definiti come simboli.

    Ignorando se è una buona idea avere tante forme in un unico elemento grafico o non, è possibile utilizzare lettere, numeri e simboli come forme. Quindi, se si voleva, dire, 73 forme uniche, basato su un fattore di 73 livelli, è possibile utilizzare il 19 simboli, lettere maiuscole e minuscole, i numeri 0 e 1 come values.

    scale_shape_manual(values = c(0:18, letters, LETTERS, "0", "1"))
    • Grazie per l’input. Penso che valori deve essere uguale al numero di righe (numeri di serie), o il numero di riga di fattori. I dati effettivi ha più linee che ci sono simboli, così è andato attraverso l’alfabeto, quindi penso che non visualizzato alcun simbolo. I valori ancora ha bisogno di un mod funzione di ridurre la gamma di simboli.
    • Wow, quanti livelli ha sn hanno? Se si voleva davvero questo molte forme diverse, si può ottenere 71 forme uniche, se si utilizzano i simboli 0:18 così come tutte le lettere maiuscole e minuscole. Ci sono ancora di più se si avvia l’aggiunta di numeri e caratteri speciali, ma non siete sicuri di come si sarebbe mai in grado di dire tutto parte di un complotto.
    • Alcuni dei personaggi sono più di 400 livelli. So che non è una buona trama, sto solo cercando modelli…
    • Invece di lettere, come posso ottenere numeri interi a sostituire la forma? Mi rendo conto che le lettere e le LETTERE sono costruiti in costanti. Grazie per la tua utile risposta – molto più di quanto ho ottenuto il mio!
    • Si può usare, ad esempio, values = as.character(1:11). Basta assicurarsi che i numeri che si desidera utilizzare sono indicati come personaggi in scale_shape_manual.
    • Grazie @aosmith! Per qualche ragione non ha funzionato come previsto in ggplot(df, aes(x, y))+geom_point(aes(shape = z), size = 5)+scale_shape_manual(values = as.character(0:29)) dove df <- data.frame(x = runif(30),y = runif(30),z = factor(0:29)). Ma penso di risolvere solo con le lettere maiuscole e minuscole. Grazie per la tua risposta sopra, troppo!
    • C’è un modo per marcare le forme usando caratteri unicode invece di caratteri ascii standard?
    • Forse. Vedere qui

  3. 0

    è possibile ottenere circa un centinaio di diverse forme, se hai bisogno di loro. bene.forme è un vettore a forma di numeri che rendono sul mio schermo senza riempire argomento.

    library(ggplot2)
    N = 100; M = 1000
    good.shapes = c(1:25,33:127)
    foo = data.frame( x = rnorm(M), y = rnorm(M), s = factor( sample(1:N, M, replace = TRUE) ) )
    ggplot(aes(x,y,shape=s ), data=foo ) +
        scale_shape_manual(values=good.shapes[1:N]) +
            geom_point()

Lascia un commento