web-dev-qa-db-fra.com

L'esthétique doit être soit de longueur un, soit de la même longueur que le dataProblems

Je voudrais faire un tracé avec les valeurs X comme sous-ensemble de la mesure et les valeurs Y comme autre sous-ensemble des données mesurées.

Dans l'exemple ci-dessous, j'ai 4 produits p1, p2, p3 et p4. Chaque prix est calculé en fonction de son orientation, de sa couleur et de sa version. Je voudrais créer un graphique multi-facettes décrivant les produits P3 (axe des Y) par rapport aux produits P1 (axe des X).

Ma tentative ci-dessous a échoué lamentablement avec l'erreur suivante:

Erreur: L'esthétique doit être soit de longueur un, soit de la même longueur que le problème dataProblems: sous-ensemble (prix, produit == "p1"), sous-ensemble (prix, produit == "p3")

library(ggplot2)
product=c("p1","p1","p1","p1","p1","p1","p1","p1","p2","p2","p2","p2","p2","p2","p2","p2","p3","p3","p3","p3","p3","p3","p3","p3","p4","p4","p4","p4","p4","p4","p4","p4")
skew=c("b","b","b","b","a","a","a","a","b","b","b","b","a","a","a","a","b","b","b","b","a","a","a","a","b","b","b","b","a","a","a","a")
version=c(0.1,0.1,0.2,0.2,0.1,0.1,0.2,0.2,0.1,0.1,0.2,0.2,0.1,0.1,0.2,0.2,0.1,0.1,0.2,0.2,0.1,0.1,0.2,0.2,0.1,0.1,0.2,0.2,0.1,0.1,0.2,0.2)
color=c("C1","C2","C1","C2","C1","C2","C1","C2","C1","C2","C1","C2","C1","C2","C1","C2","C1","C2","C1","C2","C1","C2","C1","C2","C1","C2","C1","C2","C1","C2","C1","C2")
price=c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32)
df = data.frame(product, skew, version, color, price)
# First plot all the data
p1 <- ggplot(df, aes(x=price, y=price, colour=factor(skew))) + geom_point(size=2, shape=19)
p1 <- p1 + facet_grid(version ~ color)
p1 # This gavea very good plot. So far so good
# Now plot P3 vs P1
p1 <- ggplot(df, aes(x=subset(price, product=='p1'), y=subset(price, product=='p3'), colour=factor(skew))) + geom_point(size=2, shape=19)
p1
# failed with: Error: Aesthetics must either be length one, or the same length as the dataProblems:subset(price, product == "p1"), subset(price, product == "p3")

C'est le résultat que j'attends:

This is the result I am expecting

29
Riad

Le problème est que skew n'est pas sous-configuré dans colour=factor(skew), donc sa longueur est incorrecte. Puisque subset(skew, product == 'p1') est identique à subset(skew, product == 'p3'), dans ce cas, le sous-ensemble utilisé n'a pas d'importance. Vous pouvez donc résoudre votre problème avec:

p1 <- ggplot(df, aes(x=subset(price, product=='p1'),
                     y=subset(price, product=='p3'),
                     colour=factor(subset(skew, product == 'p1')))) +
              geom_point(size=2, shape=19)

Notez que la plupart des utilisateurs de R écriront ceci comme étant le plus concis:

p1 <- ggplot(df, aes(x=price[product=='p1'],
                     y=price[product=='p3'],
                     colour=factor(skew[product == 'p1']))) +
              geom_point(size=2, shape=19)
19
David Robinson

Il est préférable de ne pas sous-définir les variables à l'intérieur de aes(), mais de transformer vos données:

df1 <- unstack(df,form = price~product)
df1$skew <- rep(letters[2:1],each = 4)

p1 <- ggplot(df1, aes(x=p1, y=p3, colour=factor(skew))) + 
        geom_point(size=2, shape=19)
p1
23
joran

Similaire à la réponse de @ Joran. Remodelez le df pour que les prix de chaque produit soient dans des colonnes différentes:

xx <- reshape(df, idvar=c("skew","version","color"),
              v.names="price", timevar="product", direction="wide")

xx aura des colonnes price.p1, ... price.p4, donc:

ggp <- ggplot(xx,aes(x=price.p1, y=price.p3, color=factor(skew))) +
       geom_point(shape=19, size=5)
ggp + facet_grid(color~version)

donne le résultat de votre image.

6
jlhoward

J'ai frappé cette erreur parce que je spécifiais un attribut label dans mon geom (geom_text) mais spécifiait une couleur dans le niveau supérieur aes:

df <- read.table('match-stats.tsv', sep='\t')
library(ggplot2)

# don't do this!
ggplot(df, aes(x=V6, y=V1, color=V1)) +
  geom_text(angle=45, label=df$V1, size=2)

Pour résoudre ce problème, je viens de déplacer l'attribut label en dehors du geom et dans le premier niveau aes:

df <- read.table('match-stats.tsv', sep='\t')
library(ggplot2)

# do this!
ggplot(df, aes(x=V6, y=V1, color=V1, label=V1)) +
  geom_text(angle=45, size=2)
1
duhaime