我将数据保存为包含12列的.csv
文件。第2列到第11列(标记为F1, F2, ..., F11
)为features
。 Column one
包含这些功能的label
good
或bad
。
我想针对boxplot
绘制label
所有这11项功能,但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]范围内的比例相同。
可以找到测试数据here。我亲自动手解释问题(见下文)。
答案 0 :(得分:93)
在绘制之前,您应该通过融化数据(请参阅下面有关熔化数据的样子)来获取特定格式的数据。否则,你所做的似乎没问题。
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))
编辑:我意识到你可能需要分面。这也是一个实现:
p <- ggplot(data = df.m, aes(x=variable, y=value)) +
geom_boxplot(aes(fill=Label))
p + facet_wrap( ~ variable, scales="free")
修改2 :如何添加x-labels
,y-labels
,title
,更改legend heading
,添加jitter
?< / p>
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
编辑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
答案 1 :(得分:19)
由于你没有提到一个情节包,我在这里建议使用Lattice
版本(我认为ggplot2答案比格子更多,至少因为我在这里)。
## 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")
答案 2 :(得分:11)
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)
<强>简介:强>
答案 3 :(得分:11)
使用基本图形,我们可以使用at =
控制框位置,并结合boxwex =
框的宽度。第一个boxplot
语句创建一个空白图。然后在以下两个语句中添加2个跟踪。
请注意,在下文中,我们使用df[,-1]
从要绘制的值中排除第一(id)列。对于不同的数据框,可能需要将此更改为子集,以包含要包含要绘制的数据的列。
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)))
boxplot(df[,-1], xlim = c(0.5, ncol(df[,-1])+0.5),
boxfill=rgb(1, 1, 1, alpha=1), border=rgb(1, 1, 1, alpha=1)) #invisible boxes
boxplot(df[which(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[which(df$id=="Bad"), -1], xaxt = "n", add = TRUE, boxfill="blue", boxwex=0.25,
at = 1:ncol(df[,-1]) + 0.15) #shift these right by +0.15
答案 4 :(得分:5)
我知道这是一个较旧的问题,但它也是我所拥有的问题,虽然接受的答案有效,但有一种方法可以做类似的事情没有使用额外的包ggplot或格子。箱形图重叠而不是并排展示并不是很好,但是:
boxplot(data1[,1:4])
boxplot(data2[,1:4],add=TRUE,border="red")
这将放入两组箱图,第二组的轮廓(无填充)为红色,并且还将异常值设为红色。好消息是,它适用于两个不同的数据帧而不是尝试重塑它们。快速而肮脏的方式。
答案 5 :(得分:3)