【问题标题】:R plot function - axes for a line chartR绘图功能 - 折线图的轴
【发布时间】:2013-12-12 18:28:03
【问题描述】:

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

这里的问题是,指定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"))
    

至少效果很好。 ;-)

  1. 接下来我为男性创建线:

    lines(1:5, table(slm$tv_serien[slm$sex == 1]), col = "blue")
    

这里的问题是没有 DK (=8) 答案,所以我必须手动指定 x = 1:5 而不是“正常”情况下的 1:6。我的问题是,如何告诉 R 也为不存在的值画线?例如,如果没有男性回答 3,但我想要一条连续的线,会发生什么?

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

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

总结一下:

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

感谢您的帮助!

PS:附上您找到上述功能的当前图。

PPS:我试图从“1”列出一个列表。到“4”。但似乎每个新的列表元素都以“1”重新开始。对不起。

【问题讨论】:

  • 这并不能回答您的问题,但折线图甚至是此类数据的最佳可视化形式吗?既然你在谈论计数,我会认为条形图会更合适。
  • 我提到的一些选项here 你可能也感兴趣....
  • 绝对正确。我只是以此为例。条形图会更有意义,我设法创建了一个不错的图表,但我为折线图提到的问题仍然存在,并且对于其他(更合适的)情况也是如此。
  • 对于您的第一个问题,解决方案是使用因子。将您的值(即 1:5 和 8)转换为因子,如果需要,您甚至可以适当地命名它们。
  • @Frank:我试过了,但如果我使用plot(factor(slm$tv_serien)...),我无法阻止通过type ="n" 绘制绘图,因为这不是为plot.factor 指定的。所以我总是会得到一个我不想要的条形图。

标签: r plot line


【解决方案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~.)

【讨论】:

  • 嗯,感谢您的建议。当然,使用 ggplot 包,您可以构建比使用普通绘图功能更漂亮的图形。但老实说,这并不能解决我的问题。 :/ 我只是想知道用给定的数据集构建折线图的最佳方法是什么。 @Frank 还提到条形图更适合给定数据,我知道这一点。但同样,请仅将数据视为示例。
猜你喜欢
  • 2019-05-24
  • 1970-01-01
  • 1970-01-01
  • 2017-04-14
  • 2016-10-09
  • 1970-01-01
  • 1970-01-01
  • 2016-11-12
  • 1970-01-01
相关资源
最近更新 更多