R语言:频数柱形图、直方图,数据归一化,标准化,取平方根,log
2020-10-15 本文已影响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和根号)