多个盒子并排放在一个盒子图中

时间:2018-04-13 11:32:37

标签: r ggplot2 boxplot

我想在一个图表中绘制几个箱图,并知道那里已有类似的线程,但似乎没有一个适用于我的情况。

我需要可视化的数据描述:我有关于哪些政策领域被认为是重要的选民调查数据(x),我想通过数据来对比这些选民投票给某一方的可能性(y) )。如果我只想为一个派对做这件事,这很简单,但想法是在一个图中为三个派对绘制它(否则我们会有太多的数字并且很难将它们相互比较)。

让我们来看看这些假设数据(MyData):

Party_A     Party_B     Party_C     Salience
8           2           5           "Environmental policy"
7           0           4           "Environmental policy"
9           3           6           "Environmental policy"
0           9           4           "Tax policy"
1           8           3           "Tax policy"
2           6           3           "Tax policy"
2           3           9           "Immigration policy"
3           5           9           "Immigration policy"
1           6           0           "Immigration policy"

“Party_A:C”代表“你会考虑投票......(0-10比例)”和“显着性”只是表明他们提到哪些政策领域很重要。 (如果提到了一个策略区域,我还有另一组二进制变量为1,如果没有,则为0,这些变量的名称只是给定的策略区域 - 以防需要这样做。)

现在这就是我的尝试:

library(ggplot2)
ggplot(MyData, aes(Salience,Party_A)) + geom_boxplot(fill="black", alpha=.5) +
geom_boxplot(aes(Salience,Party_B), fill="blue", alpha=.5) +
geom_boxplot(aes(Salience,Party_C), alpha=.5) +
geom_hline(yintercept=5, color="darkred", linetype="dotted") + 
theme(text=element_text(family="serif"), panel.background=element_blank(),
    axis.text.x=element_text(angle=90,hjust=1,vjust=.3))

这给了我的是: enter image description here

这有两个问题我无法解决:

  1. 这些盒子显然是在彼此的顶部,即使alpha = .5它仍然看起来很乱,无法比较任何东西。因此,有没有办法让它们分组为每个政策区域的三个框的集群?像here这样做显然很好,但我的数据结构显然不允许通过将fill=labels作为组指示符来实现这一点。
  2. 另一个问题是NA-bar我无法摆脱:我尝试在ggplot代码中包含na.omit()并事先通过这样做对其进行子集化:MyData[!is.na(MyData)]。在这两种情况下,图表都会消失。
  3. 这有什么解决方案吗?感谢任何建议!

1 个答案:

答案 0 :(得分:1)

这样做的一种方法是以长格式处理您的数据。此外,它会缩短并澄清你的命令。

您可以在包melt中使用reshape2功能。

library(ggplot2)
library(reshape2)

这是您的数据示例。

dat <- read.table(text='Party_A     Party_B     Party_C     Salience
8           2           5           "Environmental policy"
7           0           4           "Environmental policy"
9           3           6           "Environmental policy"
0           9           4           "Tax policy"
1           8           3           "Tax policy"
2           6           3           "Tax policy"
2           3           9           "Immigration policy"
3           5           9           "Immigration policy"
1           6           0           "Immigration policy"', 
                  header=TRUE)

融化数据的命令。

dat.m <- melt(dat, variable.name = "Party", value.name="Vote")

绘制数据的命令:ggplot会自动将箱形图放在需要的位置。

ggplot(data=dat.m, aes(x=Salience, y=Vote, fill=Party)) +
  geom_boxplot(alpha=0.5) + 
  scale_fill_manual(values=c("black", "blue", "white")) +
  geom_hline(yintercept=5, color="darkred", linetype="dotted") + 
  theme(text=element_text(family="serif"), panel.background=element_blank(),
        axis.text.x=element_text(angle=90,hjust=1,vjust=.3))

With melted data