He creado un gráfico de barras en ggplot2 donde 3 de las barras representan la probabilidad de acertar 1 de 3 opciones.

Quiero añadir un en negrita borde alrededor de la barra que muestra la respuesta correcta.

No he encontrado una manera de hacer esto. Puedo cambiar el color de TODOS los bares, pero no sólo una.

La imagen adjunta se muestra la cuadrícula de los gráficos me han generado. En el leftCust columna quiero que todos los bares con ‘izquierda’ debajo de ellos para tener una negrita de la frontera.

En el rightCust columna que desea agregar a la negrita de la frontera a todos los bares con la derecha debajo de ellos.

Y, finalmente, en el SIMCust columna quiero que todos los bares con SIM debajo de ellos para tener una negrita de la frontera.

Esto es, básicamente, para resaltar la respuesta correcta y hacer que sea más fácil explicar lo que los gráficos están mostrando.

Hacer de la frontera en una barra más oscura que la de los demás

CÓDIGO:

    dataRarrangeExpD <- read.csv("EXP2D.csv", header =TRUE);
library(ggplot2)
library("matrixStats")
library("lattice")
library("gdata")
library(plyr)
library(doBy)
library(Epi)
library(reshape2)
library(graphics)
#Create DataFrame with only Left-to-Right Visual Presentation
DataRearrangeD <- dataRarrangeExpD[, c("correct","Circle1", "Beep1","correct_response", "response", "subject_nr")]
#data_exp1$target_coh > 0
# Add new columns to hold choices made
DataRearrangeD[c("RightChoice", "LeftChoice", "SimChoice")] <- 0
DataRearrangeD$RightChoice <- ifelse(DataRearrangeD$response == "l", 1, 0)
DataRearrangeD$LeftChoice <- ifelse(DataRearrangeD$response == "a", 1, 0)
DataRearrangeD$SimChoice <- ifelse(DataRearrangeD$response == "space", 1, 0)
Exp2D.data = DataRearrangeD
# Construct data frames of report probability
SIM.vis.aud.df = aggregate(SimChoice ~ Circle1 + Beep1 + subject_nr, data = Exp2D.data, mean)
RightFirst.vis.aud.df = aggregate(RightChoice ~ Circle1 + Beep1 + subject_nr, data = Exp2D.data, mean)
LeftFirst.vis.aud.df = aggregate(LeftChoice ~ Circle1 + Beep1 + subject_nr, data = Exp2D.data, mean)
# combine data frames
mean.vis.aud.df = data.frame(SIM.vis.aud.df, RightFirst.vis.aud.df$RightChoice, LeftFirst.vis.aud.df$LeftChoice)
colnames(mean.vis.aud.df)[5:5] = c("Right")
colnames(mean.vis.aud.df)[6:6] = c("Left")
colnames(mean.vis.aud.df)[4:4] = c("SIM")
colnames(mean.vis.aud.df)[1:2] = c("Visual", "Audio")
# using reshape 2, we change the data frame to long format## measure.var column 3 up to column 5 i.e. 3,4,5
mean.vis.aud.long = melt(mean.vis.aud.df, measure.vars = 4:6, variable.name = "Report", value.name = "Prob")
# re-order levels of Report for presentation purposes
mean.vis.aud.long$Report = Relevel(mean.vis.aud.long$Report, ref = c("Left", "SIM", "Right"))
mean.vis.aud.long$Visual = Relevel(mean.vis.aud.long$Visual, ref = c("LeftCust","SIMCust","RightCust"))
#write.table(mean.vis.aud.long, "C:/Documents and Settings/psundere/My Documents/Analysis/Exp2_Pilot/reshape.txt",row.names=F) 
##############################################################################################
##############################################################################################
# Calculate SD, SE Means etc.
##############################################################################################
##############################################################################################
CalSD <- mean.vis.aud.long[, c("Prob", "Report", "Visual", "Audio", "subject_nr")]
# Get the average effect size by Prob
CalSD.means <- aggregate(CalSD[c("Prob")], 
by = CalSD[c("subject_nr", "Report", "Visual", "Audio")], FUN=mean)
#"correct","Circle1", "Beep1","correct_response", "response", "subject_nr"
# multiply by 100
CalSD.means$Prob <- CalSD.means$Prob*100
# Get the sample (n-1) standard deviation for "Probability"
CalSD.sd <- aggregate(CalSD.means["Prob"],
by = CalSD.means[c("Report","Visual", "Audio")], FUN=sd)
# Calculate SE --> SD /sqrt(N)
CalSD.se <- CalSD.sd$Prob / sqrt(25)
SE <- CalSD.se
# Confidence Interval @ 95% --> Standard Error * qt(0.975, N-1) SEE help(qt)
#.975 instead of .95 becasuse the 5% is 2.5% either side of the distribution
ci <- SE*qt(0.975,24)
##############################################################################################
##############################################################################################
###################################################
# Bar Graph
#mean.vis.aud.long$Audio <- factor (mean.vis.aud.long$Audio, levels = c("left", "2centre","NoBeep", "single","right"))
AggBar <- aggregate(mean.vis.aud.long$Prob*100,
by=list(mean.vis.aud.long$Report,mean.vis.aud.long$Visual, mean.vis.aud.long$Audio),FUN="mean")
#Change column names
colnames(AggBar) <- c("Report", "Visual", "Audio","Prob")
# Change the order of presentation
#CondPerRow$AuditoryCondition <- factor (CondPerRow$AuditoryCondition, levels = c("NoBeep", "left", "right"))
prob.bar = ggplot(AggBar, aes(x = Report, y = Prob, fill = Report)) + theme_bw() + facet_grid(Audio~Visual)
prob.bar + geom_bar(position=position_dodge(.9), stat="identity", colour="black") + theme(legend.position = "none") + labs(x="Report", y="Probability of Report") + scale_fill_grey() +
labs(title = expression("Visual Condition")) +
theme(plot.title = element_text(size = rel(1)))+
geom_errorbar(aes(ymin=Prob-ci, ymax=Prob+ci),
width=.2, # Width of the error bars
position=position_dodge(.9))+
theme(plot.title = element_text(size = rel(1.5)))+
scale_y_continuous(limits = c(0, 100), breaks = (seq(0,100,by = 10)))

Esto es lo que AggBar parece que después de la manipulación justo antes de la generación de la gráfica:

        Report  Visual  Audio   Prob
1   Left    LeftCust    2centre 81.84
2   SIM LeftCust    2centre 13.52
3   Right   LeftCust    2centre 4.64
4   Left    SIMCust 2centre 17.36
5   SIM SIMCust 2centre 69.76
6   Right   SIMCust 2centre 12.88
7   Left    RightCust   2centre 8.88
8   SIM RightCust   2centre 13.12
9   Right   RightCust   2centre 78.00
10  Left    LeftCust    left    94.48
11  SIM LeftCust    left    2.16
12  Right   LeftCust    left    3.36
13  Left    SIMCust left    65.20
14  SIM SIMCust left    21.76
15  Right   SIMCust left    13.04
16  Left    RightCust   left    31.12
17  SIM RightCust   left    4.40
18  Right   RightCust   left    64.48
19  Left    LeftCust    NoBeep  66.00
20  SIM LeftCust    NoBeep  26.08
21  Right   LeftCust    NoBeep  7.92
22  Left    SIMCust NoBeep  10.96
23  SIM SIMCust NoBeep  78.88
24  Right   SIMCust NoBeep  10.16
25  Left    RightCust   NoBeep  8.48
26  SIM RightCust   NoBeep  26.24
27  Right   RightCust   NoBeep  65.28
28  Left    LeftCust    right   62.32
29  SIM LeftCust    right   6.08
30  Right   LeftCust    right   31.60
31  Left    SIMCust right   17.76
32  SIM SIMCust right   22.16
33  Right   SIMCust right   60.08
34  Left    RightCust   right   5.76
35  SIM RightCust   right   3.60
36  Right   RightCust   right   90.64
37  Left    LeftCust    single  49.92
38  SIM LeftCust    single  47.84
39  Right   LeftCust    single  2.24
40  Left    SIMCust single  6.56
41  SIM SIMCust single  87.52
42  Right   SIMCust single  5.92
43  Left    RightCust   single  3.20
44  SIM RightCust   single  52.40
45  Right   RightCust   single  44.40

.
.
.

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Utilizando el código presentado por Troy a continuación pongo un pequeño giro sobre ella y se acercó con una wee solución a la falta de patrones en ggplot2 para los gráficos de barras.

Aquí está el código que he usado para agregar líneas verticales a los bares para lograr un patrón básico para la respuesta correcta de las barras. Estoy seguro de que usted inteligente folk por ahí podía adaptar a sus propias necesidades con respecto textura/patrones aunque los básicos:

######### ADD THIS LINE TO CREATE THE HIGHLIGHT SUBSET
HighlightDataCust <-AggBar[AggBar$Report==gsub("Cust", "", AggBar$Visual),]
#####################################################
prob.bar = ggplot(AggBar, aes(x = Report, y = Prob, fill = Report)) + theme_bw() + facet_grid(Audio~Visual)
prob.bar + geom_bar(position=position_dodge(.9), stat="identity", colour="black") + theme(legend.position = "none") + labs(x="Response", y="Probability of Report") + scale_fill_grey() +
######### ADD THIS LINE TO CREATE THE HIGHLIGHT SUBSET
geom_bar(data=HighlightDataCust, position=position_dodge(.9), stat="identity", colour="black", size=2)+
geom_bar(data=HighlightDataCust, position=position_dodge(.9), stat="identity", colour="black", size=0.5, width=0.85)+
geom_bar(data=HighlightDataCust, position=position_dodge(.9), stat="identity", colour="black", size=0.5, width=0.65)+
geom_bar(data=HighlightDataCust, position=position_dodge(.9), stat="identity", colour="black", size=0.5, width=0.45)+
geom_bar(data=HighlightDataCust, position=position_dodge(.9), stat="identity", colour="black", size=0.5, width=0.25)+
geom_bar(data=HighlightDataCust, position=position_dodge(.9), stat="identity", colour="black", width=0.0) +
######################################################
labs(title = expression("Visual Condition")) +
theme(text=element_text(size=18))+
theme(axis.title.x=element_text(size=18))+
theme(axis.title.y=element_text(size=18))+
theme(axis.text.x=element_text(size=12))+
geom_errorbar(aes(ymin=Prob-ci, ymax=Prob+ci),
width=.2, # Width of the error bars
position=position_dodge(.9))+
theme(plot.title = element_text(size = 18))+
scale_y_continuous(limits = c(0, 100), breaks = (seq(0,100,by = 10)))

Este es el resultado. Claramente las líneas pueden ser hechas de cualquier color que usted desea y una mezcla de colores. Sólo asegúrese de que usted comience con el más amplio y ancho, y trabajar hacia 0.0 así que las capas no sobre-escribir. Espero que alguien encuentra este útil. (También debe ser posible crear líneas horizontales en el interior de los bares si uno se para crear varias capas con diferentes eje alturas decir, la parte superior de cada uno de los diferentes altura de la barra aparecerá como una línea horizontal. No he probado a mí mismo, pero puede ser vale la pena considerar para aquellos que requieren más de un patrón de barras. La combinación de ambos en un bar, debe resultar en un patrón de malla y no olvides que los colores diferentes también puede ser utilizado. En resumen creo que este enfoque es una manera decente de revisión por la falta de un patrón en ggplot2.)

He creado un ejemplo de los 3 tipos de patrón que he mencionado aquí: Cómo agregar textura a los colores de relleno en ggplot2?

Hacer de la frontera en una barra más oscura que la de los demás

  • ¿Puede volver a propósito de color? No se ve como la escala de grises para colorear en los bares es la adición de cualquier información. Tal vez usted puede utilizar esto en lugar de mostrar la respuesta correcta. También, el código sería bueno.
  • Lamentablemente tengo que pegar con el gris de las barras. Color habría sido una buena solución simple. Saludos.
InformationsquelleAutor Docconcoct | 2013-12-02

2 Comentarios

  1. 14

    No tengo los datos, por lo que he utilizado el diamonds conjunto de datos para demostrar.

    Básicamente, usted necesita ‘overplot’ un segundo geom_bar() llamada, donde se filtra el data= atributo sólo dibujar las barras que desea resaltar. Acaba de filtrar los datos originales para excluir cualquier cosa que usted no desea. e.g a continuación se replot el subconjunto diamonds[(diamonds$clarity=="SI2"),]

    d <- ggplot(diamonds) +  geom_bar(aes(clarity, fill=color))    # first plot
    d + geom_bar(data=diamonds[(diamonds$clarity=="SI2"),],        # filter
    aes(clarity), alpha=0, size=1, color="black") +                # plot outline only
    facet_wrap(~ cut) 

    NB, obviamente, el filtro va a ser más complicado, por ejemplo,

    data=yourdata[(yourdata$visualcondition=="LeftCust" & yourdata$report=="Left" |
    yourdata$visualcondition=="SIMCust" & yourdata$report=="SIM" |
    yourdata$visualcondition=="RightCust" & yourdata$report=="Right"),]

    Hacer de la frontera en una barra más oscura que la de los demás

    ACEPTAR actualizado con los datos. Yo tenía que hacer los intervalos de confianza debido a que no estaban disponibles en el AggBar2 de datos:

    ######### ADD THIS LINE TO CREATE THE HIGHLIGHT SUBSET
    HighlightData<-AggBar2[AggBar2$Report==gsub("Cust","",AggBar2$Visual),]
    #####################################################
    prob.bar = ggplot(AggBar2, aes(x = Report, y = Prob, fill = Report)) + theme_bw() + facet_grid(Audio~Visual)
    prob.bar + geom_bar(position=position_dodge(.9), stat="identity", colour="black") + theme(legend.position = "none") + labs(x="Report", y="Probability of Report") + scale_fill_grey() +
    ######### ADD THIS LINE TO CREATE THE HIGHLIGHT SUBSET
    geom_bar(data=HighlightData, position=position_dodge(.9), stat="identity", colour="pink",size=1) +
    ######################################################
    labs(title = expression("Visual Condition")) +
    theme(plot.title = element_text(size = rel(1)))+
    geom_errorbar(aes(ymin=Prob-ci, ymax=Prob+ci),
    width=.2, # Width of the error bars
    position=position_dodge(.9))+
    theme(plot.title = element_text(size = rel(1.5)))+
    scale_y_continuous(limits = c(0, 100), breaks = (seq(0,100,by = 10)))

    Hacer de la frontera en una barra más oscura que la de los demás

  2. 18

    Similar a Troy respuesta, pero en lugar de crear una capa invisible de barras, usted puede utilizar el size estética y scale_size_manual:

    require(ggplot2)
    data(diamonds)
    diamonds$choose = factor(diamonds$clarity == "SI1")
    ggplot(diamonds) + 
    geom_bar(aes(x = clarity, fill=clarity, size=choose), color="black") +
    scale_size_manual(values=c(0.5, 1), guide = "none") +
    facet_wrap(~ cut)

    El cual se produce la siguiente parcela:

    Hacer de la frontera en una barra más oscura que la de los demás

Dejar respuesta

Please enter your comment!
Please enter your name here