Wykreśl wiele boxplot w jednym wykresie

Zapisałem swoje dane w pliku .csv z 12 kolumnami. Kolumny od 2 do 11 (oznaczone F1, F2, ..., F11) to features. Column one zawiera label tych cech albo good albo bad.

Chciałbym narysować boxplot z wszystkich tych 11 cech przeciwko label, ale rozdzielić przez good lub bad. Mój kod do tej pory to:

qplot(Label, F1, data=testData, geom = "boxplot", fill=Label, 
          binwidth=0.5, main="Test") + xlab("Label") + ylab("Features")

Jednak to pokazuje tylko F1 przeciwko label.

Moje pytanie brzmi: jak pokazać F2, F3, ..., F11 na tle label w jednym wykresie z jakieś dodge position? Znormalizowałem funkcje, więc są one w tej samej skali w zakresie [0 1].

Dane testowe można znaleźć proszę.. Narysowałem coś ręcznie, aby wyjaśnić problem (patrz poniżej).

ręcznie rysowany boxplot przykład

Author: Arun, 2013-01-30

6 answers

Powinieneś uzyskać dane w określonym formacie przez stopienie danych (zobacz poniżej, jak wyglądają stopione dane) przed wykreśleniem. W przeciwnym razie, to co zrobiłeś wydaje się być w porządku.

require(reshape2)
df <- read.csv("TestData.csv", header=T)
# melting by "Label". `melt is from the reshape2 package. 
# do ?melt to see what other things it can do (you will surely need it)
df.m <- melt(df, id.var = "Label")
> df.m # pasting some rows of the melted data.frame

#     Label variable      value
# 1    Good       F1 0.64778924
# 2    Good       F1 0.54608791
# 3    Good       F1 0.46134200
# 4    Good       F1 0.79421221
# 5    Good       F1 0.56919951
# 6    Good       F1 0.73568570
# 7    Good       F1 0.65094207
# 8    Good       F1 0.45749702
# 9    Good       F1 0.80861929
# 10   Good       F1 0.67310067
# 11   Good       F1 0.68781739
# 12   Good       F1 0.47009455
# 13   Good       F1 0.95859182
# 14   Good       F1 1.00000000
# 15   Good       F1 0.46908343
# 16    Bad       F1 0.57875528
# 17    Bad       F1 0.28938046
# 18    Bad       F1 0.68511766

require(ggplot2)
ggplot(data = df.m, aes(x=variable, y=value)) + geom_boxplot(aes(fill=Label))

boxplot_ggplot2

Edit: zdaję sobie sprawę, że być może będziesz musiał to ująć. Oto implementacja tego również:

p <- ggplot(data = df.m, aes(x=variable, y=value)) + 
             geom_boxplot(aes(fill=Label))
p + facet_wrap( ~ variable, scales="free")

ggplot2_faceted

Edit 2: Jak dodać x-labels, y-labels, title, zmienić legend heading, dodać jitter?

p <- ggplot(data = df.m, aes(x=variable, y=value)) 
p <- p + geom_boxplot(aes(fill=Label))
p <- p + geom_jitter()
p <- p + facet_wrap( ~ variable, scales="free")
p <- p + xlab("x-axis") + ylab("y-axis") + ggtitle("Title")
p <- p + guides(fill=guide_legend(title="Legend_Title"))
p 

ggplot2_geom_plot

Edytuj 3: Jak wyrównać geom_point() wskazuje na środek pola-działki? Można to zrobić za pomocą position_dodge. To powinno zadziałać.

require(ggplot2)
p <- ggplot(data = df.m, aes(x=variable, y=value)) 
p <- p + geom_boxplot(aes(fill = Label))
# if you want color for points replace group with colour=Label
p <- p + geom_point(aes(y=value, group=Label), position = position_dodge(width=0.75))
p <- p + facet_wrap( ~ variable, scales="free")
p <- p + xlab("x-axis") + ylab("y-axis") + ggtitle("Title")
p <- p + guides(fill=guide_legend(title="Legend_Title"))
p 

ggplot2_position_dodge_geom_point

 121
Author: Arun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-30 20:18:37

Używając Grafiki bazowej, możemy użyć at = do kontrolowania pozycji skrzynki, w połączeniu z boxwex = dla szerokości skrzynek. Pierwsza boxplot instrukcja tworzy pusty wykres. Następnie dodaj 2 ślady w następujących dwóch stwierdzeniach.

Zauważ, że w poniższym przykładzie używamy df[,-1], aby wykluczyć 1.kolumnę (id) z wartości do wykresu. W przypadku różnych ramek danych może być konieczna zmiana tej wartości na podzbiór dla dowolnych kolumn zawierających dane, które chcesz fabuła

boxplot(df[,-1], boxfill = NA, border = NA) #invisible boxes - only axes and plot area
boxplot(df[df$id=="Good", -1], xaxt = "n", add = TRUE, boxfill="red", 
  boxwex=0.25, at = 1:ncol(df[,-1]) - 0.15) #shift these left by -0.15
boxplot(df[df$id=="Bad", -1], xaxt = "n", add = TRUE, boxfill="blue", 
  boxwex=0.25, at = 1:ncol(df[,-1]) + 0.15) #shift to the right by +0.15

Tutaj wpisz opis obrazka

Niektóre atrapy danych:

df <- data.frame(
  id = c(rep("Good",200), rep("Bad", 200)),
  F1 = c(rnorm(200,10,2), rnorm(200,8,1)),
  F2 = c(rnorm(200,7,1),  rnorm(200,6,1)),
  F3 = c(rnorm(200,6,2),  rnorm(200,9,3)),
  F4 = c(rnorm(200,12,3), rnorm(200,8,2)))
 22
Author: dww,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-06-17 14:37:17

Ponieważ nie wspominasz o pakiecie fabularnym, proponuję tutaj użycie wersji Lattice (myślę, że jest więcej odpowiedzi na ggplot2 niż kratowych, przynajmniej skoro tu jestem w SO).

 ## reshaping the data( similar to the other answer)
 library(reshape2)
 dat.m <- melt(TestData,id.vars='Label')
 library(lattice)
 bwplot(value~Label |variable,    ## see the powerful conditional formula 
        data=dat.m,
        between=list(y=1),
        main="Bad or Good")

Tutaj wpisz opis obrazka

 20
Author: agstudy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-30 14:44:41

Ggplot wersja kraty działki:

library(reshape2)
library(ggplot2)
df <- read.csv("TestData.csv", header=T)
df.m <- melt(df, id.var = "Label")

ggplot(data = df.m, aes(x=Label, y=value)) + 
         geom_boxplot() + facet_wrap(~variable,ncol = 4)

Fabuła: Tutaj wpisz opis obrazka

 12
Author: Jonas Tundo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-31 07:44:54

Wiem, że jest to trochę starsze pytanie, ale to też miałem, i chociaż zaakceptowane odpowiedzi działają, istnieje sposób, aby zrobić coś podobnego Bez za pomocą dodatkowych pakietów, takich jak ggplot lub lattice. Nie jest to aż tak miłe w tym, że boxploty nakładają się na siebie, a nie pokazują się obok siebie, ale: {]}

boxplot(data1[,1:4])
boxplot(data2[,1:4],add=TRUE,border="red")

obraz tego, co to robi.

To umieszcza w dwóch zestawach kartonów, przy czym drugi ma kontur (bez wypełnienia) w kolorze czerwonym, a także umieszcza wartości odstające w kolorze czerwonym. The nice thing is, działa dla dwóch różnych ram danych, zamiast próbować je przekształcić. Szybki i brudny sposób.

 7
Author: user2103050,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-26 16:05:26

W bazie R można użyć interfejsu formula_1 z oddziaływaniami (:).

df <- read.csv("~/Desktop/TestData.csv")
df <- data.frame(stack(df[,-1]), Label=df$Label) # reshape to long format

boxplot(values ~ Label:ind, data=df, col=c("red", "limegreen"), las=2)

przykład

 4
Author: Karolis Koncevičius,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-08 12:42:35