web-dev-qa-db-fra.com

Plus de six formes dans ggplot

Je voudrais tracer des lignes de formes différentes avec plus de six ensembles de données, en utilisant des couleurs discrètes. Les problèmes sont 1) une légende différente est générée pour la couleur et la forme de la ligne, mais ne devrait être qu'une seule légende avec la couleur et la forme de la ligne, 2) lors de la correction du titre de la légende de la couleur de la ligne, la couleur disparaît.

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)
25
user3969377

Tout d'abord, il serait plus facile de convertir sn en facteur.

df$sn <- factor(df$sn)

Ensuite, vous devez utiliser scale_shape_manual pour spécifier les formes à utiliser.

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

Cela devrait vous donner ce que vous voulez. Vous devez utiliser scale_shape_manual parce que, même avec sn comme facteur, ggplot n'ajoutera automatiquement que jusqu'à 6 symboles différents. Après cela, vous devez les spécifier manuellement. Vous pouvez modifier vos symboles de différentes manières. Jetez un œil à ces pages pour plus d'informations sur la façon dont: http://sape.inf.usi.ch/quick-reference/ggplot2/shape
http://www.cookbook-r.com/Graphs/Shapes_and_line_types/

enter image description here

46
Cotton.Rockwood

Pour moi, la clé du message d'erreur sur les 6 formes est la partie qui dit Consider specifying shapes manually..

Si vous ajoutez dans le values dans scale_shape_manual, Je crois que vous obtiendrez ce que vous voulez. J'ai d'abord fait de sn un facteur dans l'ensemble de données.

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)

Je vais sur le Cookbook for R site quand j'ai besoin de me rappeler quels nombres correspondent à quelles formes.

Modifier L'exemple ci-dessus montre l'ajout de 11 symboles, le même nombre de symboles dans votre exemple de jeu de données. Vos commentaires indiquent que vous avez beaucoup plus de valeurs uniques pour la variable sn que dans votre exemple. Soyez prudent lorsque vous utilisez une longue série de nombres dans values, car tous les nombres ne sont pas définis comme des symboles.

Ignorant si c'est une bonne idée d'avoir autant de formes dans un seul graphique ou non, vous pouvez utiliser des lettres et des chiffres ainsi que des symboles comme des formes. Donc, si vous vouliez, disons, 73 formes uniques basées sur un facteur de 73 niveaux, vous pourriez utiliser 19 symboles, toutes les lettres majuscules et minuscules, et les chiffres 0 et 1 comme values.

scale_shape_manual(values = c(0:18, letters, LETTERS, "0", "1"))
7
aosmith

vous pouvez obtenir une centaine de formes différentes si vous en avez besoin. good.shapes est un vecteur des numéros de forme qui s'affichent sur mon écran sans aucun argument de remplissage.

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()
0
Nathan Siemers