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

导读

统计一组数据的频数或给改组数据分类,然后分别用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))
R语言:频数柱形图、直方图,数据归一化,标准化,取平方根,log10处理_第1张图片

二、计算频数和画柱形图

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="")
R语言:频数柱形图、直方图,数据归一化,标准化,取平方根,log10处理_第2张图片

三、添加分组和画直方图

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
R语言:频数柱形图、直方图,数据归一化,标准化,取平方根,log10处理_第3张图片

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)
R语言:频数柱形图、直方图,数据归一化,标准化,取平方根,log10处理_第4张图片

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
R语言:频数柱形图、直方图,数据归一化,标准化,取平方根,log10处理_第5张图片

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()
R语言:频数柱形图、直方图,数据归一化,标准化,取平方根,log10处理_第6张图片

有效果了

八、log10后直方图

1 计算log10

df2$log10 = log10(df2$num)
R语言:频数柱形图、直方图,数据归一化,标准化,取平方根,log10处理_第7张图片

2 直方图

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

也有效果

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

你可能感兴趣的:(R语言:频数柱形图、直方图,数据归一化,标准化,取平方根,log10处理)