I have created a new geom figuring a ray which incorporate mean, 2 sd error bar, 1.5 IQR error bar, 3e 25e, 50e, 75e and 97e centiles, observations on a base of violin.
# domestic functions
#~~~~~~~~~~~~~~~~~~~
IQR.interval.min <- function( vector )
{
quantile( vector, 0.25 ) - 1.5 * IQR( vector ) ;
} ;
IQR.interval.max <- function( vector )
{
quantile( vector, 0.75 ) + 1.5 * IQR( vector ) ;
} ;
SD.interval.min <- function( vector )
{
mean( vector ) - 2 * sd( vector ) ;
} ;
SD.interval.max <- function( vector )
{
mean( vector ) + 2 * sd( vector ) ;
} ;
# My geom
geom_ray <- function( ... ,
violin.param = list( draw_quantiles = c( 0.03, 0.25, 0.5, 0.75, 0.97 ),
scale = "count" ),
point.param = list(),
IQR.param = list( colour = "black", width = 0.2 ),
mean.param = list(shape = 18, size = 4, colour = "darkgrey",
position = position_nudge( x = 0.12 )),
SD.param = list( colour = "darkgrey", width = 0.2,
position = position_nudge( x = 0.12 ) )
)
{
# graph
#~~~~~~
# Parameters
param <- list( ... ) ;
violin.param <- modifyList( param, violin.param ) ;
point.param <- modifyList( param, point.param ) ;
IQR.param <- modifyList( param, IQR.param ) ;
mean.param <- modifyList( param, mean.param ) ;
SD.param <- modifyList( param, SD.param ) ;
# Stats
violin.gg <- do.call( "stat_ydensity",
modifyList( list( geom = GeomViolin,
position = "dodge" ),
violin.param ) ) ;
point.gg <- do.call( "stat_identity",
modifyList( list( geom = GeomPoint,
position = "identity" ),
point.param ) ) ;
IQR.gg <- do.call( "stat_summary",
modifyList( list( fun.ymin = "IQR.interval.min",
fun.ymax = "IQR.interval.max",
geom = GeomErrorbar,
position = "identity" ),
IQR.param ) ) ;
mean.gg <- do.call( "stat_summary",
modifyList( list( fun.y = "mean",
geom = GeomPoint ),
mean.param ) ) ;
SD.gg <- do.call( "stat_summary",
modifyList( list( fun.ymin = "SD.interval.min",
fun.ymax = "SD.interval.max",
geom = GeomErrorbar ),
SD.param ) ) ;
# Output
#~~~~~~~
return( list( violin.gg,
point.gg,
IQR.gg,
mean.gg,
SD.gg
)
)
} ;
It is well running when I use aes outside of the geom.
# i.e.
vector1 <- rnorm(200, 10, 20) ;
factor1 <- factor( sample( c( "homme", "femme" ), 200, TRUE, c( 0.4,0.6 ) ) ) ;
data.frame( factor1 = factor1, vector1 = vector1 ) ->
df1
require( dplyr ) ; require( ggplot2 ) ;
df1 %>%
ggplot(.) +
aes( x = factor1, y = vector1 ) +
geom_ray( )
However, it is not running when I use aes inside the geom :
df1 %>%
ggplot(.) +
geom_ray( aes( x = factor1, y = vector1 ) )
# Return:
Erreur : stat_ydensity requires the following missing aesthetics: x, y
Could someone help me to fix it please ?
Thanks