Участок множественного ящика в одном графике
Я сохранил свои данные в виде файла .csv
с 12 столбцами. Столбцы с 2 по 11 (помечены как F1, F2, ..., F11
) - features
. Column one
содержит label
этих функций либо good
, либо bad
.
Я хотел бы построить a boxplot
из всех этих 11 признаков по сравнению с label
, но отдельно от good
или bad
. До сих пор мой код:
qplot(Label, F1, data=testData, geom = "boxplot", fill=Label,
binwidth=0.5, main="Test") + xlab("Label") + ylab("Features")
Однако это показывает только F1
в отношении label
.
Мой вопрос: как показать F2, F3, ..., F11
против label
в одном графике с некоторым dodge position
? Я нормализовал функции, поэтому они находятся в одном масштабе в диапазоне [0 1].
Тестовые данные можно найти здесь. Я нарисовал что-то вручную, чтобы объяснить проблему (см. Ниже).
![hand-drawn boxplot example]()
Ответы
Ответ 1
Вы должны получить свои данные в определенном формате, расплавив свои данные (см. ниже, как выглядят похожие данные). В противном случае, что вы сделали, похоже, все в порядке.
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]()
Изменить: Я понимаю, что вам может понадобиться фасет. Здесь также реализована реализация:
p <- ggplot(data = df.m, aes(x=variable, y=value)) +
geom_boxplot(aes(fill=Label))
p + facet_wrap( ~ variable, scales="free")
![ggplot2_faceted]()
Изменить 2: Как добавить x-labels
, y-labels
, title
, изменить legend heading
, добавить 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]()
Изменить 3:. Как выровнять geom_point()
указывает на центр квадратного графика? Это можно сделать, используя position_dodge
. Это должно работать.
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]()
Ответ 2
Поскольку вы не упоминаете пакет сюжетов, я предлагаю здесь использовать версию Lattice
(я думаю, что есть больше ответов ggplot2, чем решетчатые, по крайней мере, так как я здесь, в 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")
![enter image description here]()
Ответ 3
Используя базовую графику, мы можем использовать at =
для управления положением блока, в сочетании с boxwex =
для ширины блоков. 1-й оператор boxplot
создает пустой график. Затем добавьте 2 следа в следующих двух утверждениях.
Обратите внимание, что в дальнейшем мы используем df[,-1]
чтобы исключить 1-й столбец (id) из значений для построения. Для разных фреймов данных может потребоваться изменить это на подмножество для тех столбцов, которые содержат данные, которые вы хотите построить.
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
![enter image description here]()
Некоторые фиктивные данные:
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)))
Ответ 4
ggplot версия решетки:
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)
Plot:
![enter image description here]()
Ответ 5
Я знаю, что это немного более старый вопрос, но у меня он тоже был, и хотя принятые ответы работают, есть способ сделать что-то подобное без использования дополнительных пакетов, таких как ggplot или lattice. Это не так хорошо, потому что боксы перекрываются, а не показываются рядом, но:
boxplot(data1[,1:4])
boxplot(data2[,1:4],add=TRUE,border="red")
![picture of what this does.]()
Это помещает в два набора коробочных графиков, второй из которых имеет контур (без заливки) красным, а также выделяет выбросы красным. Приятно то, что он работает для двух разных фреймов данных, а не пытается изменить их. Быстрый и грязный путь.
Ответ 6
В базе R формула интерфейс с взаимодействиями (:
) может быть использовано для достижения этой цели.
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)
![example]()