2012-08-11 18 views
5

Estoy tratando de crear un gráfico de barras apiladas usando ggplot 2. Mis datos en su forma amplia, se ven así. Los números en cada celda son la frecuencia de las respuestas.Cómo crear un gráfico de barras apiladas a partir de datos resumidos en ggplot2

activity       yes no dontknow 
Social events      27 3 3 
Academic skills workshops   23 5 8 
Summer research     22 7 7 
Research fellowship    20 6 9 
Travel grants      18 8 7 
Resume preparation    17 4 12 
RAs        14 11 8 
Faculty preparation    13 8 11 
Job interview skills    11 9 12 
Preparation of manuscripts  10 8 14 
Courses in other campuses   5 11 15 
Teaching fellowships    4 14 16 
TAs        3 15 15 
Access to labs in other campuses 3 11 18 
Interdisciplinary research   2 11 18 
Interdepartamental projects  1 12 19 

que funde esta tabla usando reshape2 y

melted.data(wide.data,id.vars=c("activity"),measure.vars=c("yes","no","dontknow"),variable.name="haveused",value.name="responses") 

Eso es por lo que yo puedo conseguir. Quiero crear un gráfico de barras apiladas con actividades sobre el eje X, la frecuencia de respuestas en el eje y, y cada uno de barras que muestra la distribución de los sí, NOS y dontknows

He intentado

ggplot(melted.data,aes(x=activity,y=responses))+geom_bar(aes(fill=haveused)) 

pero me temo que esa no es la solución correcta

Cualquier ayuda es muy apreciada.

Respuesta

5

No ha dicho qué es lo que no funciona en su solución. Pero algunos problemas que podrían interpretarse como problemas, y una posible solución para cada uno, son:

  • Las etiquetas de las marcas de eje x se topan entre sí. SOLUCIÓN: gire las etiquetas de las marcas;
  • El orden en que aparecen las etiquetas (y sus barras correspondientes) no es el mismo que el orden en el marco de datos original. SOLUCIÓN - reordenar los niveles del factor 'actividad';
  • Para colocar el texto dentro de las barras de establecer el parámetro vjust en position_stack a 0,5

El siguiente podría ser un comienzo.

# Load required packages 
library(ggplot2) 
library(reshape2) 

    # Read in data 
df = read.table(text = " 
activity       yes no dontknow 
Social.events      27 3 3 
Academic.skills.workshops   23 5 8 
Summer.research     22 7 7 
Research.fellowship    20 6 9 
Travel.grants      18 8 7 
Resume.preparation    17 4 12 
RAs        14 11 8 
Faculty.preparation    13 8 11 
Job.interview.skills    11 9 12 
Preparation.of.manuscripts  10 8 14 
Courses.in.other.campuses   5 11 15 
Teaching.fellowships    4 14 16 
TAs        3 15 15 
Access.to.labs.in.other.campuses 3 11 18 
Interdisciplinay.research   2 11 18 
Interdepartamental.projects  1 12 19", header = TRUE, sep = "") 

    # Melt the data frame 
dfm = melt(df, id.vars=c("activity"), measure.vars=c("yes","no","dontknow"), 
    variable.name="haveused", value.name="responses") 

    # Reorder the levels of activity 
dfm$activity = factor(dfm$activity, levels = df$activity) 

    # Draw the plot 
ggplot(dfm, aes(x = activity, y = responses, group = haveused)) + 
geom_col(aes(fill=haveused)) + 
theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.25)) + 
geom_text(aes(label = responses), position = position_stack(vjust = .5), size = 3) # labels inside the bar segments 
Cuestiones relacionadas