tutorial ggplot español barplot r graph ggplot2

barplot - ggplot2 tutorial español



Creando un gráfico de Pareto con ggplot2 y R (7)

Además, vea el paquete qcc que tiene una función pareto.chart() . Parece que también usa gráficos base, así que comienza tu recompensa por una solución ggplot2 :-)

He estado luchando con cómo hacer un Gráfico de Pareto en R usando el paquete ggplot2. En muchos casos, al hacer un gráfico de barras o un histograma, queremos que los elementos estén ordenados por el eje X. En un gráfico de Pareto queremos que los artículos estén ordenados descendentemente por el valor en el eje Y. ¿Hay alguna manera de hacer que ggplot grafique los elementos ordenados por el valor en el eje Y? Intenté ordenar el marco de datos primero, pero parece que ggplot los reordena.

Ejemplo:

val <- read.csv("http://www.cerebralmastication.com/wp-content/uploads/2009/11/val.txt") val<-with(val, val[order(-Value), ]) p <- ggplot(val) p + geom_bar(aes(State, Value, fill=variable), stat = "identity", position="dodge") + scale_fill_brewer(palette = "Set1")

La trama de datos val está ordenada pero la salida se ve así:

texto alternativo http://www.cerebralmastication.com/wp-content/uploads/2009/11/exp.png

Hadley señaló correctamente que esto produce un gráfico mucho mejor para mostrar datos reales en comparación con lo previsto:

ggplot(val, aes(State, Value)) + geom_bar(stat = "identity", subset = .(variable == "estimate"), fill = "grey70") + geom_crossbar(aes(ymin = Value, ymax = Value), subset = .(variable == "actual"))

que devuelve:

texto alternativo http://www.cerebralmastication.com/wp-content/uploads/2009/11/exp1.png

Pero todavía no es un gráfico de Pareto. ¿Algun consejo?


Con un ejemplo simple:

> data PC1 PC2 PC3 PC4 PC5 PC6 PC7 PC8 PC9 PC10 0.29056 0.23833 0.11003 0.05549 0.04678 0.03788 0.02770 0.02323 0.02211 0.01925

barplot(data) hace las cosas correctamente

el equivalente de ggplot "debería ser": qplot(x=names(data), y=data, geom=''bar'')

Pero eso incorrectamente reordena / ordena las barras alfabéticamente ... porque así es como se ordenan los levels(factor(names(data))) .

Solución: qplot(x=factor(names(data), levels=names(data)), y=data, geom=''bar'')

¡Uf!


Las barras en ggplot2 están ordenadas por el orden de los niveles en el factor.

val$State <- with(val, factor(val$State, levels=val[order(-Value), ]$State))


Para simplificar las cosas, solo consideremos las estimaciones.

estimates <- subset(val, variable == "estimate")

Primero reordenamos los niveles de los factores, para que los State se representen en orden decreciente de Value .

estimates$State <- with(estimates, reorder(State, -Value))

Del mismo modo, reordenamos el conjunto de datos y calculamos un valor acumulativo.

estimates <- estimates[order(estimates$Value, decreasing = TRUE),] estimates$cumulative <- cumsum(estimates$Value)

Ahora estamos listos para dibujar la trama. El truco para obtener una línea y una barra en los mismos ejes es convertir la variable de estado (un factor) para que sea numérica.

p <- ggplot(estimates, aes(State, Value)) + geom_bar() + geom_line(aes(as.numeric(State), cumulative)) p

Como se mencionó en la pregunta, tratar de dibujar dos diagramas de Pareto de dos grupos de variables uno al lado del otro no es muy fácil. Probablemente sea mejor usar facetas si desea múltiples parcelas de Pareto.


Subcontratar y ordenar tus datos;

valact <- subset(val, variable==''actual'') valsort <- valact[ order(-valact[,"Value"]),]

A partir de ahí, es solo un boxplot() estándar con una función acumulativa muy manual en la parte superior:

op <- par(mar=c(3,3,3,3)) bp <- barplot(valsort [ , "Value"], ylab="", xlab="", ylim=c(0,1), names.arg=as.character(valsort[,"State"]), main="How''s that?") lines(bp, cumsum(valsort[,"Value"])/sum(valsort[,"Value"]), ylim=c(0,1.05), col=''red'') axis(4) box() par(op)

que debería verse así

texto alternativo http://dirk.eddelbuettel.com/misc/jdlong_pareto.png

y ni siquiera necesita el truco de overplotting como lines() anota felizmente la trama inicial.


Un gráfico de Pareto tradicional en ggplot2 .......

Desarrollado después de leer Cano, EL, Moguerza, JM, y Redchuk, A. (2012). Six Sigma con R. (G. Robert, K. Hornik, y G. Parmigiani, Eds.) Springer.

library(ggplot2);library(grid) counts <- c(80, 27, 66, 94, 33) defects <- c("price code", "schedule date", "supplier code", "contact num.", "part num.") dat <- data.frame(count = counts, defect = defects, stringsAsFactors=FALSE ) dat <- dat[order(dat$count, decreasing=TRUE),] dat$defect <- factor(dat$defect, levels=dat$defect) dat$cum <- cumsum(dat$count) count.sum<-sum(dat$count) dat$cum_perc<-100*dat$cum/count.sum p1<-ggplot(dat, aes(x=defect, y=cum_perc, group=1)) p1<-p1 + geom_point(aes(colour=defect), size=4) + geom_path() p1<-p1+ ggtitle(''Pareto Chart'')+ theme(axis.ticks.x = element_blank(), axis.title.x = element_blank(),axis.text.x = element_blank()) p1<-p1+theme(legend.position="none") p2<-ggplot(dat, aes(x=defect, y=count,colour=defect, fill=defect)) p2<- p2 + geom_bar() p2<-p2+theme(legend.position="none") plot.new() grid.newpage() pushViewport(viewport(layout = grid.layout(2, 1))) print(p1, vp = viewport(layout.pos.row = 1,layout.pos.col = 1)) print(p2, vp = viewport(layout.pos.row = 2,layout.pos.col = 1))


freqplot = function(x, by = NULL, right = FALSE) { if(is.null(by)) stop(''Valor de "by" precisa ser especificado.'') breaks = seq(min(x), max(x), by = by ) ecd = ecdf(x) den = ecd(breaks) table = table(cut(x, breaks = breaks, right = right)) table = table/sum(table) intervs = factor(names(table), levels = names(table)) freq = as.numeric(table/sum(table)) acum = as.numeric(cumsum(table)) normalize.vec = function(x){ (x - min(x))/(max(x) - min(x)) } dados = data.frame(classe = intervs, freq = freq, acum = acum, acum_norm = normalize.vec(acum)) p = ggplot(dados) + geom_bar(aes(classe, freq, fill = classe), stat = ''identity'') + geom_point(aes(classe, acum_norm, group = ''1''), shape = I(1), size = I(3), colour = ''gray20'') + geom_line(aes(classe, acum_norm, group = ''1''), colour = I(''gray20'')) p }