para - poligono en r
La estética debe tener la longitud uno o la misma longitud que los problemas de datos. (4)
Me gustaría hacer un gráfico con los valores de X como un subconjunto de la medición y los valores de Y como otro subconjunto de los datos medidos.
En el siguiente ejemplo, tengo 4 productos p1, p2, p3 y p4. Cada uno tiene un precio de acuerdo a su sesgo, color y versión. Me gustaría crear un gráfico multifacético que represente los productos P3 (eje Y) frente a los productos P1 (eje X).
Mi intento como el siguiente ha fallado miserablemente con el siguiente error:
Error: la estética debe tener la longitud uno o la misma longitud que los problemas de datos: subconjunto (precio, producto == "p1"), subconjunto (precio, producto == "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")
Este es el resultado que estoy esperando:
El problema es que el skew
no se está subdividiendo en colour=factor(skew)
, por lo que es la longitud incorrecta. Como el subset(skew, product == ''p1'')
es el mismo que el subset(skew, product == ''p3'')
, en este caso no importa qué subconjunto se utilice. Así podrás resolver tu problema con:
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)
Tenga en cuenta que la mayoría de los usuarios de R escribirían esto como más conciso:
p1 <- ggplot(df, aes(x=price[product==''p1''],
y=price[product==''p3''],
colour=factor(skew[product == ''p1'']))) +
geom_point(size=2, shape=19)
Es mejor no agrupar las variables dentro de aes()
y, en cambio, transformar sus datos:
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
Hice este error porque estaba especificando un atributo de etiqueta en mi geom ( geom_text
) pero estaba especificando un color en el nivel superior 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)
Para solucionar esto, acabo de mover el atributo de etiqueta fuera del geom y al nivel superior 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)
Similar a la respuesta de @joran. Cambie la forma del df para que los precios de cada producto estén en columnas diferentes:
xx <- reshape(df, idvar=c("skew","version","color"),
v.names="price", timevar="product", direction="wide")
xx tendrá columnas price.p1, ... price.p4, entonces:
ggp <- ggplot(xx,aes(x=price.p1, y=price.p3, color=factor(skew))) +
geom_point(shape=19, size=5)
ggp + facet_grid(color~version)
Da el resultado de tu imagen.