在一个图中绘制多个箱线图


77

我将数据保存为.csv12列的文件。第2列到第11列(标记为F1, F2, ..., F11featuresColumn one包含或label这些功能的。goodbad

我想将所有这11个特征中的一个boxplot与相对,但用或分开。到目前为止,我的代码是:labelgoodbad

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

但是,这仅F1针对label

我的问题是:如何显示F2, F3, ..., F11label在一个图表一些dodge position?我已将功能标准化,因此它们在[0 1]范围内处于相同比例。

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

手绘箱线图示例


1
(+1)您的信息包含所有内容,但格式不完全。我想那是不赞成的。请学习使用SO格式选项!它会帮您很多。另外,您应该dput(testData)在此处使用并粘贴输出,而不是将链接发布到CSV,以便人们可以直接在其系统上复制/粘贴。
阿伦(Arun)2013年

非常感谢,阿伦。我将尝试格式化以后的帖子。我试图粘贴数据,但发现其中包含许多数字。但是我应该创建一个较小的玩具问题。
Samo Jerom

Answers:


117

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

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-labelsy-labelstitle,改变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


另一个问题:如何使用此方法更改x标签和y标签?例如,不要使用“值”和“变量”。非常感谢。
Samo Jerom

scale_x_discrete(name =“ xxx”)+ scale_y_continuous(name =“ yyy”)
Samo Jerom 2013年

我想知道如何添加叠加在箱线图上的“添加原始数据点”。我想使用geom_point()或geom_jitter(); 但是,正如我尝试的那样,这些点重叠在一起,不能分为两组,即这里的好坏。
Samo Jerom 2013年

非常感谢您的帮助。最后一点,我想将原始数据点叠加在箱线图上。我尝试了geom_point()或geom_jitter()。例如,当我使用geom_point()时,来自“好”和“坏”数据集的数据点重叠在一起,并显示在上面显示的橙色和蓝色框的中间。但是,我希望将原始点沿每个框的中线(晶须)分别覆盖。很抱歉再次打扰您,但请帮助我看看这个问题。再次非常感谢。
萨摩耶罗姆

1
1.刚刚注意到,此线性p <-p + geom_point(aes(y = value,group = Label),position = position_dodge(width = 0.75))发出警告:“未定义ymax:使用y调整位置”在线解决方案p <-p + geom_point(aes(ymax = max(value),group = Label),position = position_dodge(width = 0.75))但是,不清楚为什么“ position_dodge”需要ymax而不是y。只是给其他想摆脱警告的人的提示。
Samo Jerom

20

因为您没有提到plot包,所以我在这里建议使用Latticeversion(我认为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")

在此处输入图片说明


另一个问题:如何使用此方法更改x标签和y标签?
Samo Jerom

@SamoJerom,例如ylab="value"xlab="treatment"在bwplot语句中添加例如:
agstudy 2013年

@agstudy我想知道如何添加叠加在箱线图上的“添加原始数据点”。我想使用geom_point()或geom_jitter(); 但是,正如我尝试的那样,这些点重叠在一起,不能分为两组,即好点或坏点。
Samo Jerom

20

使用基本图形,我们可以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)))

12

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)

情节: 在此处输入图片说明


7

我知道这是一个比较老的问题,但是我也有这个问题,虽然可接受的答案有效,但是有一种方法可以做类似的事情而无需使用其他软件包,例如ggplot或lattice。箱形图重叠而不是并排显示,但并没有那么好,但是:

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

这是做什么的图片。

这将放入两组箱形图,第二组将轮廓线(无填充)用红色表示,还将异常值用红色表示。令人高兴的是,它适用于两个不同的数据框,而不是尝试重塑它们。快速而肮脏的方式。


4

在基数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)

例


有没有办法对箱形图进行刻面?
亚当·贝拉切(AdamBellaïche),
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.