Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

I would like to make a plot with X values as a subset of the measurement and Y-values as another subset of the measured data.

In the example as below, I have 4 products p1, p2, p3 and p4. Each are priced according to their skew, color and version. I would like to create a multi-facet plot that depicts the P3 products (Y-axis) vs P1 products (X-axis).

My attempt as below has failed miserably with the following error:

Error: Aesthetics must either be length one, or the same length as the dataProblems:subset(price, product == "p1"), subset(price, product == "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") 

This is the result I am expecting:

This is the result I am expecting

like image 276
Riad Avatar asked Nov 18 '13 20:11

Riad


1 Answers

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 
like image 109
joran Avatar answered Oct 03 '22 04:10

joran