2017-09-02 1 views
3

Dies sollte relativ einfach scheinen, aber ich kann kein Argument finden, das würde mir erlauben, dies zu tun, und ich habe Google und Stack nach einer Antwort gesucht.Entfernen der Ränder in geom_boxplot in ggplot2

Beispielcode:

library(ggplot2) 
library(plotly) 

dat <- data.frame(cond = factor(rep(c("A","B"), each=200)), rating = c(rnorm(200),rnorm(200, mean=.8))) 

p <- ggplot(dat, aes(x=cond, y=rating, fill=cond)) + geom_boxplot() 

p <- ggplotly(p) 

Dies gibt das erste Diagramm, würde ich so etwas wie die zweite wollen. Fig

Ich versuchte colour=cond einschließlich, aber das wird der Median befreien.

Antwort

1

Hier eine unelegant Lösung wird auf Grobs basiert:

set.seed(1) 
dat <- data.frame(cond = factor(rep(c("A","B"), each=200)), 
        rating = c(rnorm(200),rnorm(200, mean=.8))) 

library(ggplot2) 
library(plotly) 
p <- ggplot(dat, aes(x=cond, y=rating, fill=cond)) + geom_boxplot() 

# Generate a ggplot2 plot grob 
g <- ggplotGrob(p) 

# The first box-and-whiskers grob 
box_whisk1 <- g$grobs[[6]]$children[[3]]$children[[1]] 
pos.box1 <- which(grepl("geom_crossbar",names(box_whisk1$children))) 
g$grobs[[6]]$children[[3]]$children[[1]]$children[[pos.box1]]$children[[1]]$gp$col <- 
    g$grobs[[6]]$children[[3]]$children[[1]]$children[[pos.box1]]$children[[1]]$gp$fill 

# The second box-and-whiskers grob  
box_whisk2 <- g$grobs[[6]]$children[[3]]$children[[2]] 
pos.box2 <- which(grepl("geom_crossbar",names(box_whisk2$children))) 
g$grobs[[6]]$children[[3]]$children[[2]]$children[[pos.box2]]$children[[1]]$gp$col <- 
    g$grobs[[6]]$children[[3]]$children[[2]]$children[[pos.box2]]$children[[1]]$gp$fill 

library(grid) 
grid.draw(g) 

enter image description here

P. S. Nach meinem Wissen kann der obige Code nicht zum Generieren von plotly Graphen verwendet werden.

2

Zwei mögliche Hacks zur Prüfung, die den gleichen Datensatz wie Marco Sandri verwenden.

Hack 1. Wenn Sie nicht wirklich brauchen es plotly zu arbeiten in nur statisches ggplot Bild:

ggplot(dat, aes(x=cond, y=rating, fill=cond)) + 
    geom_boxplot() + 
    geom_boxplot(aes(color = cond), 
       fatten = NULL, fill = NA, coef = 0, outlier.alpha = 0, 
       show.legend = F) 

Hack 1

Diese überlagert die ursprüngliche boxplot mit einer Version, die im Wesentlichen eine Übersicht der äußeren Box, die mittleren versteckt (fatten = NULL), Füllfarbe (fill = NA), Whiskers (coef = 0) & Ausreißer (outlier.alpha = 0).

Es scheint jedoch nicht gut mit plotly zu arbeiten. Ich habe es mit der dev-Version von ggplot2 (wie von plotly empfohlen) ohne Erfolg getestet. Siehe Ausgabe unter:

Hack 1 plotly

Hack 2. Wenn Sie es brauchen plotly zu arbeiten in:

ggplot(dat %>% 
     group_by(cond) %>% 
     mutate(rating.IQR = case_when(rating <= quantile(rating, 0.3) ~ quantile(rating, 0.25), 
             TRUE ~ quantile(rating, 0.75))), 
     aes(x=cond, y=rating, fill=cond)) + 
    geom_boxplot() + 
    geom_boxplot(aes(color = cond, y = rating.IQR), 
       fatten = NULL, fill = NA) 

(ggplot Ausgang gleich wie oben ist)

plotly nicht die coef = 0 & output.alpha = 0 Befehle zu verstehen scheint, so dass dieser Hack schafft eine modifizierte Version der y Variable, so dass alles unter P30 auf P25 eingestellt ist und alles darüber auf P75 eingestellt ist. Dies erzeugt einen Boxplot ohne Ausreißer, keine Whisker und der Median liegt zusammen mit der oberen Boxgrenze bei P75.

Es ist umständlicher, aber es funktioniert in plotly:

Hack 2 plotly

Verwandte Themen