Aesthetics must either be length one, or the same length as the dataProblems Aesthetics must either be length one, or the same length as the dataProblems r r

Aesthetics must either be length one, or the same length as the dataProblems


It is better to not subset the variables inside aes(), and instead transform your data:

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


The problem is that skew isn't being subsetted in colour=factor(skew), so it's the wrong length. Since subset(skew, product == 'p1') is the same as subset(skew, product == 'p3'), in this case it doesn't matter which subset is used. So you can solve your problem with:

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)

Note that most R users would write this as the more concise:

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


Similar to @joran's answer. Reshape the df so that the prices for each product are in different columns:

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

xx will have columns price.p1, ... price.p4, so:

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

gives the result from your image.