说我有两个因素,我想在同一个图上绘制图形,两个因素都有相同的水平。
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来绘制它。
答案 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"))
或者如果您希望男性/女性并排以便于比较:
t1 <- table(s1)
t2 <- table(s2)
barchart(cbind(t1, t2), stack = F, horizontal = F)
答案 1 :(得分:3)
来自?table
:
'table'使用交叉分类因子来构建意外事件 每种因子水平组合的计数表。
执行table(s1,s2)
时,该功能会将s1
和s2
视为配对结果。它实际上告诉你,如果你要采用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)
中CRANplot()
包中的mosaic()
函数
vcd
正在为这两个因素产生contingency table。
答案 3 :(得分:1)
在这种情况下,他只需要创建一个“表”(我认为他的意思是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"))
希望这有帮助。