在同一图表上绘制两个因子

时间:2010-11-01 01:24:15

标签: r factors

说我有两个因素,我想在同一个图上绘制图形,两个因素都有相同的水平。

s1 <- c(rep("male",20), rep("female", 30))
s2 <- c(rep("male",10), rep("female", 40))
s1 <- factor(s1, levels=c("male", "female"))
s2 <- factor(s2, levels=c("male", "female"))

我原以为使用table函数会产生正确的图形结果,但会弹出。

table(s1, s2)
        s2 
s1       male female   
male     10     10   
female    0     30

所以真的有两个问题,表函数用来获得这个结果是什么?我可以用什么其他函数来创建一个使用相同级别函数的2系列图形?

此外,如果这是一个因素,我在gplots包中使用barplot2来绘制它。

4 个答案:

答案 0 :(得分:5)

使用网格包可以获得更详细的结果:

s1 <- factor(c(rep("male",20), rep("female", 30)))
s2 <- factor(c(rep("male",10), rep("female", 40)))
D <- data.frame(s1, s2)

library(lattice)
histogram(~s1+s2, D, col = c("pink", "lightblue"))

alt text

或者如果您希望男性/女性并排以便于比较:

t1 <- table(s1)
t2 <- table(s2)
barchart(cbind(t1, t2), stack = F, horizontal = F)

alt text

答案 1 :(得分:3)

来自?table

  

'table'使用交叉分类因子来构建意外事件     每种因子水平组合的计数表。

执行table(s1,s2)时,该功能会将s1s2视为配对结果。它实际上告诉你,如果你要采用cbind(s1,s2)那么就会有10排男性 - 男性,10位男性 - 女性等等。

要理解这一点,请考虑一个非常简单的例子:

a <- c("M","M","F","F")
b <- c("F","F","M","M")
table(a,b)

  b
a   F M
  F 0 2
  M 2 0

你应该做的是:

t1 <- table(s1)
t2 <- table(s2)
barplot(cbind(t1,t2), beside=TRUE, col=c("lightblue", "salmon"))

答案 2 :(得分:3)

产生略有不同形式的图的两个选项是

plot(s1, s2)

plot(table(s1,s2))

前者是一个脊柱图,是马赛克图的特例,plot的{​​{1}}方法产生(第二个例子)。有关详细信息,请参阅table?spineplot,如果您愿意,可以直接使用这些函数,而不是通用的?mosaicplot

另请参阅Meyer等(Link to vcd on CRAN)

中CRAN plot()包中的mosaic()函数

vcd正在为这两个因素产生contingency table

答案 3 :(得分:1)

嗯..我不认为创建一个列联表是Cameron正在寻找的。如果我理解正确,我认为他想创建一个包含两个变量的数据框,其中s1和s2似乎是相同大小的向量。 (长度(S1)==长度(S2))。

在这种情况下,他只需要创建一个“表”(我认为他的意思是data.frame):

df = data.frame(s1=s1, s2=s2);

然后将2系列绘制在同一个图中。

至于绘制这些东西的第二个问题,我会使用matplot。例如:

matplot(1:10, data.frame(a=rnorm(10), b=rnorm(10)), type="l", lty=1, lwd=1, col=c("blue","red"))

鉴于他将2个向量的数据组织在一个名为“df”的data.frame中,他可以做类似的事情:

matplot(df, type="l", lty=1, lwd=1, col=c("blue","red"))

希望这有帮助。