87

我将数据保存为一个.csv包含 12 列的文件。第 2 到 11 列(标F1, F2, ..., F11有 )是featuresColumn one包含label这些功能中的一个goodbad

我想将boxplot所有这 11 个功能中的一个与label,但由goodor分开bad。到目前为止,我的代码是:

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

但是,这仅显示F1label.

我的问题是:如何F2, F3, ..., F11label一张图中显示一些dodge position?我已经对特征进行了标准化,因此它们在 [0 1] 范围内的比例相同。

测试数据可以在这里找到。我手绘了一些东西来解释这个问题(见下文)。

手绘箱线图示例

4

6 回答 6

130

在绘图之前,您应该通过融合数据来获取特定格式的数据(请参阅下文了解融合数据的外观)。否则,您所做的似乎还可以。

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、添加?titlelegend headingjitter

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

于 2013-01-30T14:00:48.517 回答
26

使用基础图形,我们可以at =用来控制盒子的位置,结合boxwex =盒子的宽度。第一条boxplot语句创建一个空白图。然后在以下两个语句中添加 2 个跟踪。

请注意,在下文中,我们使用df[,-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

在此处输入图像描述

一些虚拟数据:

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)))
于 2016-08-26T17:32:00.600 回答
20

由于您没有提及绘图包,因此我建议在这里使用Lattice版本(我认为 ggplot2 的答案比 lattice 的答案更多,至少因为我在这里)。

 ## 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")

在此处输入图像描述

于 2013-01-30T14:37:18.707 回答
13

格子图的 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)

阴谋: 在此处输入图像描述

于 2013-01-30T16:00:35.020 回答
9

我知道这是一个较老的问题,但它也是我的问题,虽然接受的答案有效,但有一种方法可以在使用 ggplot 或 lattice 等额外软件包的情况下做类似的事情。箱线图重叠而不是并排显示并不是很好,但是:

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

这是做什么的图片。

这放入了两组箱线图,第二组的轮廓(无填充)为红色,并且异常值也为红色。好消息是,它适用于两个不同的数据帧,而不是试图重塑它们。快速而肮脏的方式。

于 2016-08-26T15:08:55.150 回答
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)

例子

于 2018-10-08T12:42:35.443 回答