【问题标题】:R - graph frequency of observations over time with small value rangeR - 随时间变化的观察频率图,数值范围较小
【发布时间】:2015-02-21 23:34:34
【问题描述】:

我试图绘制随时间变化的观察频率。我有一个数据集,其中数百条法律编码为 0-3。我想知道随着时间的推移,结果 2-3 是否会更频繁地发生。这是一个模拟数据示例:

Data <- data.frame(
  year = sample(1998:2004, 200, replace = TRUE),
  score = sample(1:4, 200, replace = TRUE)
)

如果我绘图

plot(Data$year, Data$score)

我得到一个方格矩阵,其中每个点都被填充,但我不知道哪些数字出现得更频繁。有没有办法通过给定行/年的观察次数来着色或改变每个点的大小?

一些注释可能有助于回答这个问题:

1)。我不知道如何对某些数字比其他数字更频繁地出现的数据进行采样。我的示例程序从所有数字中平均采样。如果有更好的方法我应该创建我的可重复数据以反映以后几年的更多观察,我想知道如何。

2)。这似乎最好在散点图中可视化,但我可能错了。我对其他可视化持开放态度。

谢谢!

【问题讨论】:

    标签: r plot visualization


    【解决方案1】:

    这就是我的处理方法(希望这是你需要的)

    创建数据(注意:在问题中使用sample时,也请始终使用set.seed,这样可以重现)

    set.seed(123)
    Data <- data.frame(
      year = sample(1998:2004, 200, replace = TRUE),
      score = sample(1:4, 200, replace = TRUE)
    )
    

    使用table 查找score 每个year 的频率

    Data2 <- as.data.frame.matrix(table(Data))
    Data2$year <- row.names(Data2)
    

    使用melt 将其转换回长格式

    library(reshape2)
    Data2 <- melt(Data2, "year")
    

    绘制数据,同时显示每组不同的颜色和相对大小的预频率

    library(ggplot2)
    ggplot(Data2, aes(year, variable, size = value, color = variable)) +
      geom_point()
    

    或者,您可以同时使用 fillsize 来描述频率,例如

    ggplot(Data2, aes(year, variable, size = value, fill = value)) +
      geom_point(shape = 21)
    

    【讨论】:

      【解决方案2】:

      这是另一种方法:

      ggplot(Data, aes(year)) + geom_histogram(aes(fill = ..count..)) + facet_wrap(~ score)
      

      每个方面代表一个“分数”值,如每个方面的标题中所述。您可以通过查看条形的高度 + 颜色(浅蓝色表示更多计数)轻松了解计数。


      当然,如果您不希望包含分数 1 和 4,您也可以仅为 score %in% 2:3 执行此操作。在这种情况下,您可以这样做:

      ggplot(Data[Data$score %in% 2:3,], aes(year)) + 
           geom_histogram(aes(fill = ..count..)) + facet_wrap(~ score)
      

      【讨论】:

        【解决方案3】:

        这么多答案...您似乎想知道结果 2-3 的频率是否会随着时间的推移而增加,那么为什么不直接绘制它:

        set.seed(1)
        Data <- data.frame(
          year = sample(1998:2004, 200, replace = TRUE),
          score = sample(0:3, 200, replace = TRUE))
        library(ggplot2)
        ggplot(Data, aes(x=factor(year),y=score, group=(score>1)))+
          stat_summary(aes(color=(score>1)),fun.y=length, geom="line")+
          scale_color_discrete("score",labels=c("0 - 1","2 - 3"))+
          labs(x="",y="Frequency")
        

        【讨论】:

          【解决方案4】:
          > with(Data, round( prop.table(table(year,score), 1), 3)  )
          
                score
          year       1     2     3     4
            1998 0.308 0.231 0.231 0.231
            1999 0.136 0.273 0.227 0.364
            2000 0.281 0.250 0.219 0.250
            2001 0.129 0.290 0.226 0.355
            2002 0.217 0.174 0.261 0.348
            2003 0.286 0.286 0.200 0.229
            2004 0.387 0.129 0.194 0.290
          
          png(); plot(jitter(Data$year), jitter(Data$score) );dev.off()
          

          还有其他方法可以使用,如果 点非常大,以至于抖动无法让您通过肉眼确定计数。您可以使用透明色来确定点的密度。在 bu an octothorpe 之前的 8 位十六进制数字中的最后 2 个十六进制数字是颜色的 alpha 透明度。请参阅 ?rgb?col2rgb。将这两个图与新数据进行比较,让您在比例上有差异:

          Data <- data.frame(
             year = rep(1998:2004, length=49000),
             score = sample(1:7, 49000, prob=(1:7)/5, replace = TRUE)
           )
          
          png(); plot(jitter(Data$year), jitter(Data$score) );dev.off()
          

           png(); plot(jitter(Data$year), jitter(Data$score) ,
                  col="#bbbbbb11" );dev.off()
          

          【讨论】:

            【解决方案5】:

            另一种选择:

            df<-aggregate(Data$score,by= list(Data$year),table)
            matplot(df$Group.1,(df[,2]))
            

            希望对你有帮助

            【讨论】:

            • 我认为你可以只做 df &lt;- aggregate(score ~ year, Data, length); plot(df),但在我看来,OP 希望它每个单独的 score
            • 同意。我提供的解决方案不如您发布的解决方案好(顺便说一句,感谢您的教导!),但是在绘制每个数字(分数)时都是符号,因此在某些情况下可能就足够了(当然不是出于发布目的,尽管!)
            猜你喜欢
            • 2016-12-21
            • 2020-12-19
            • 1970-01-01
            • 2018-06-20
            • 1970-01-01
            • 1970-01-01
            • 2021-08-26
            • 1970-01-01
            • 2016-04-20
            相关资源
            最近更新 更多