假设R中的以下频率表来自调查:
1 2 3 4 5 8
m 5 16 3 16 5 0
f 12 25 3 10 3 1
NA 1 0 0 0 0 0
这些行代表调查受访者的性别(男/女/无答案)。列表示5分量表问题的答案(假设:1 =完全同意,2 =同意,3 =既不同意也不反对,4 =不同意,5 =完全不同意,8 =无答案)。
数据存储在名为“slm”的数据框中,性别变量称为“sex”,另一个变量称为“tv_serien”。
我的问题是,我没有找到(在我看来)正确的方法来创建折线图,其中x轴表示5点刻度(加上不知道答案)和y -axis表示刻度上每个点的频率。此外,我想创建两条线(一条用于男性,一条用于女性)。
到目前为止我的解决方案如下:
我在没有绘制“内容”和x轴的情况下创建了一个图:
plot(slm$tv_serien, xlim = c(1,6), ylim = c(0,100), type = "n", xaxt = "n")
这里的问题是指定xlim=c(1,6)
感觉就像作弊一样,因为slm$tv_serien
的原始分数是100个值。我还尝试通过plot(factor(slm$tv_serien)...)
绘制变量,但是它仍然会创建一个从1到8的度量标度(因为不知道答案是8)。
所以我的第一个问题是如何告诉R应该采用六个不同的值(1到5和8)并将其作为x轴?
我使用适当的标签创建新的x轴:
axis(1, 1:6, labels = c("1", "2", "3", "4", "5", "DK"))
至少这种方法效果很好。 ; - )
接下来,我为男性创建了一行:
lines(1:5, table(slm$tv_serien[slm$sex == 1]), col = "blue")
这里的问题是没有DK(= 8)答案,所以我手动必须在“正常”情况下指定x = 1:5
而不是1:6。我的问题是,如何告诉R还为不存在的值绘制线?例如,如果没有男性回答3,那会发生什么,但我想要一条连续线?
最后我创建了女性专线,效果很好:
lines(1:6, table(slm$tv_serien[slm$sex == 2], col = "red")
总结:
slm$tv_serien
的6个不同值作为x轴?感谢您的帮助!
PS:附上你找到上述功能的当前情节。
PPS:我试图从“1”创建一个列表。到“4”但似乎每个新的列表元素都以“1”重新开始。遗憾。
答案 0 :(得分:1)
编辑:对OP评论的回应。
这直接创建了OP数据的折线图。下面是使用ggplot
的原始答案,它产生了更高的输出。
根据您提供的频率表,
df <- data.frame(t(freqTable)) # transpose (more suitable for plotting)
df <- cbind(Response=rownames(df),df) # add row names as first column
plot(as.numeric(df$Response),df$f,type="b",col="red",
xaxt="n", ylab="Count",xlab="Response")
lines(as.numeric(df$Response),df$m,type="b",col="blue")
axis(1,at=c(1,2,3,4,5,6),labels=c("Str.Agr.","Sl.Agr","Neither","Sl.Disagr","Str.Disagr","NA"))
产生这个,这看起来像你在寻找。
原始答案:
不完全符合您的要求,但将频率表转换为数据框df
df <- data.frame(freqTable)
df <- cbind(Gender=rownames(df),df) # append rownames (Gender)
df <- df[-3,] # drop unknown gender
df
# Gender X1 X2 X3 X4 X5 X8
# m m 5 16 3 16 5 0
# f f 12 25 3 10 3 1
df <- df[-3,] # remove unknown gender column
library(ggplot2)
library(reshape2)
gg=melt(df)
labels <- c("Agree\nFully","Somewhat\nAgree","Neither Agree\nnor Disagree","Somewhat\nDisagree","Disagree\nFully", "No Answer")
ggp <- ggplot(gg,aes(x=variable,y=value))
ggp <- ggp + geom_bar(aes(fill=Gender), position="dodge", stat="identity")
ggp <- ggp + scale_x_discrete(labels=labels)
ggp <- ggp + theme(axis.text.x = element_text(angle=90, vjust=0.5))
ggp <- ggp + labs(x="", y="Frequency")
ggp
产生这个:
或者,这更好:
ggp + facet_grid(Gender~.)