美文网首页数据可视化R
R语言:频数柱形图、直方图,数据归一化,标准化,取平方根,log

R语言:频数柱形图、直方图,数据归一化,标准化,取平方根,log

作者: 胡童远 | 来源:发表于2020-10-15 16:18 被阅读0次

    导读

    统计一组数据的频数或给改组数据分类,然后分别用ggplot geom_bar、geom_histogram画柱形图和直方图。接着,对数据分别进行归一化,标准化,取平方根,log10处理,并绘制直方图。直方图显示平方根和log10处理可以将偏态数据转成仅正太分布(可以做正态性检验)。

    一、数据产生

    # 模拟数据
    data = c(sample(c(1:100), 80, replace=F),
             sample(c(100:200), 20, replace=F),
             sample(c(200:300), 10, replace=F))
    

    二、计算频数和画柱形图

    1 计算频数

    # 定义频数表,计数
    df = data.frame(label=seq(30, 300, by=30), count=rep(0, 10))
    for(i in data)
    {
        if(i < 30){df[1, 2]=df[1, 2]+1}
        else if(i < 60){df[2, 2]=df[2, 2]+1}
            else if(i < 90){df[3, 2]=df[3, 2]+1}
                else if(i < 120){df[4, 2]=df[4, 2]+1}
                    else if(i < 150){df[5, 2]=df[5, 2]+1}
                        else if(i < 180){df[6, 2]=df[6, 2]+1}   
                            else if(i < 210){df[7, 2]=df[7, 2]+1}
                                else if(i < 240){df[8, 2]=df[8, 2]+1}
                                    else if(i < 270){df[9, 2]=df[9, 2]+1}
                                        else if(i < 300 | i == 300){df[10, 2]=df[10, 2]+1}
    }
    

    2 柱形图

    # 条形图                          
    ggplot(df, aes(x=label, y=count, fill=as.character(rownames(df)))) +
      geom_bar(stat="identity") +
      theme_classic() +
      theme(legend.position="")
    

    三、添加分组和画直方图

    1 添加分组

    label = c()
    for(i in data)
    {
        if(i < 30){label = c(label, 30)}
        else if(i < 60){label = c(label, 60)}
            else if(i < 90){label = c(label, 90)}
                else if(i < 120){label = c(label, 120)}
                    else if(i < 150){label = c(label, 150)}
                        else if(i < 180){label = c(label, 180)}   
                            else if(i < 210){label = c(label, 210)}
                                else if(i < 240){label = c(label, 240)}
                                    else if(i < 270){label = c(label, 270)}
                                        else if(i < 300 | i == 300){label = c(label, 300)}
    }
    
    df2 = data.frame(label=label, num=data)
    df2
    

    2 画直方图

    ggplot(df2, aes(x=label, fill=as.factor(label))) + 
      geom_histogram(binwidth=30, color="black") +
      theme_classic() +
      theme(legend.position="")
    

    四、上面愚蠢了,geom_histogram不需要分组和计数

    直接用原始数据直方图,也就是df2第二列

    ggplot(df2, aes(x=num)) + 
      geom_histogram(binwidth=30, fill="lightblue", color="black") +
      theme_classic()
    

    修改参数binwidth

    ggplot(df2, aes(x=num)) + 
      geom_histogram(fill="lightblue", color="black") +
      theme_classic()
    

    五、归一化后的直方图

    1 归一化

    df2$to_one = df2$num/sum(df2$num)
    

    2 直方图

    ggplot(df2, aes(x=to_one)) + 
      geom_histogram(fill="lightblue", color="black") +
      theme_classic()
    

    完全同上

    六、标准化后的直方图

    1 数据标准化

    average = mean(df2$num)
    standard = sd(df2$num) 
    df2$norm = (df2$num - average)/standard
    

    2 直方图

    ggplot(df2, aes(x=norm)) + 
      geom_histogram(fill="lightblue", color="black") +
      theme_classic()
    

    没什么好转

    七、平方根后直方图

    1 计算平方根

    df2$squart = sqrt(df2$num)
    

    2 直方图

    ggplot(df2, aes(x=squart)) + 
      geom_histogram(fill="lightblue", color="black") +
      theme_classic()
    

    有效果了

    八、log10后直方图

    1 计算log10

    df2$log10 = log10(df2$num)
    

    2 直方图

    ggplot(df2, aes(x=log10)) + 
      geom_histogram(fill="lightblue", color="black") +
      theme_classic()
    

    也有效果

    参考:
    R语言-数据转化(log和根号)

    相关文章

      网友评论

        本文标题:R语言:频数柱形图、直方图,数据归一化,标准化,取平方根,log

        本文链接:https://www.haomeiwen.com/subject/axxopktx.html