R绘图功能 - 折线图的轴

时间:2013-12-12 18:28:04

标签: r plot line

假设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表示刻度上每个点的频率。此外,我想创建两条线(一条用于男性,一条用于女性)。

到目前为止我的解决方案如下:

  1. 我在没有绘制“内容”和x轴的情况下创建了一个图:

    plot(slm$tv_serien, xlim = c(1,6), ylim = c(0,100), type = "n", xaxt = "n")
    
  2. 这里的问题是指定xlim=c(1,6)感觉就像作弊一样,因为slm$tv_serien的原始分数是100个值。我还尝试通过plot(factor(slm$tv_serien)...)绘制变量,但是它仍然会创建一个从1到8的度量标度(因为不知道答案是8)。

    所以我的第一个问题是如何告诉R应该采用六个不同的值(1到5和8)并将其作为x轴?

    1. 我使用适当的标签创建新的x轴:

      axis(1, 1:6, labels = c("1", "2", "3", "4", "5", "DK"))
      
    2. 至少这种方法效果很好。 ; - )

      1. 接下来,我为男性创建了一行:

        lines(1:5, table(slm$tv_serien[slm$sex == 1]), col = "blue")
        
      2. 这里的问题是没有DK(= 8)答案,所以我手动必须在“正常”情况下指定x = 1:5而不是1:6。我的问题是,如何告诉R还为不存在的值绘制线?例如,如果没有男性回答3,那会发生什么,但我想要一条连续线?

        1. 最后我创建了女性专线,效果很好:

          lines(1:6, table(slm$tv_serien[slm$sex == 2], col = "red")
          
        2. 总结:

          • 如何告诉R将slm$tv_serien的6个不同值作为x轴?
          • 即使该行包含“0”,我如何绘制连续的行?

          感谢您的帮助!

          PS:附上你找到上述功能的当前情节。

          PPS:我试图从“1”创建一个列表。到“4”但似乎每个新的列表元素都以“1”重新开始。遗憾。

          line chart

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~.)