0

假设我有两个因素,我想将它们绘制在同一个图上,这两个因素具有相同的水平。

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

4 回答 4

6

您可以使用 lattice 包获得更详细的结果:

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

替代文字

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

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

替代文字

于 2010-11-01T09:12:47.187 回答
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"))
于 2010-11-01T07:54:46.147 回答
3

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

plot(s1, s2)

plot(table(s1,s2))

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

还可以看看Meyer 等人在 CRAN 上mosaic()的包中的功能(Link to vcd on CRAN)vcd

table()正在为这两个因素生成列联表

于 2010-11-01T07:55:45.490 回答
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"))

希望这可以帮助。

于 2010-11-01T21:38:45.600 回答