频率分布图是一种用来展示数据分布情况的图表。它通过将数据按照不同的数值区间进行分组,并计算每个区间内数据出现的频率来展示数据的分布情况。
在频率分布图中,横轴表示数据的区间或者数值范围,纵轴表示每个区间内数据的频率或者数量
。每个区间通常是等宽
的,而每个区间内数据的频率则可以用柱形的高度来表示。柱形的高度越高,表示该区间内的数据出现的频率越高。
频率分布图可以帮助人们更直观地了解数据的分布情况,包括数据的中心趋势、离散程度以及数据的偏斜性等。通过观察频率分布图,可以看出数据是否呈现正态分布、是否存在异常值或者离群点等。
除了柱状图形式的频率分布图之外,还有其他形式的频率分布图,比如直方图、饼图、线图等,不同的图形形式可以根据数据的特点和目的进行选择。
这里画一下结构变异长度频率的统计,对于一个简单的结构变异,一般只需要知道它的编号,在染色体位置,以及长度信息,基本上就可以确定这个结构变异了,
###这里只需要知道每个变异的长度信息
###图1
values <- DUP$V4
breaks <- c(-Inf, 50, 100, 500, 1000, 10000, 100000, Inf)
group_labels <- c("<50", "50-100", "101-500", "501-1000", "1001-10000", "10001-100000", ">100000")
# 计算每个组的频数
hist_counts <- table(cut(values, breaks = breaks, labels = FALSE, include.lowest = TRUE, right = TRUE))
# 添加缺失的组并设置频数为0
missing_groups <- setdiff(1:length(group_labels), as.numeric(names(hist_counts)))
if (length(missing_groups) > 0) {
hist_counts <- c(hist_counts, setNames(rep(0, length(missing_groups)), as.character(missing_groups)))
}
# 创建频率分布直方图
ggplot(data.frame(x = as.character(names(hist_counts)), y = as.numeric(hist_counts)), aes(x, y)) +
geom_bar(stat = "identity", fill = "orange", width = 0.8) +
labs(x = "", y = "count", title = "DUP fre") +
scale_x_discrete(limits = as.character(1:length(group_labels)), labels = group_labels)+ theme(panel.border = element_blank(), # 去除面板边框
panel.grid.major = element_blank(), # 去除主要网格线
panel.grid.minor = element_blank()) # 去除次要网格线+lines(density(hist_counts),lwd=2,col=rgb(0.1,0.5,0.2))
###图2
ggplot(INV,aes(x =V4))+
geom_histogram(aes(y=..count..), # 纵坐标是密度。类似也可以将纵坐标设置为频数(count)
# color="#88ada6", fill="#fffbf0", # 边框与填充色,可以不设置
alpha=.25, # 透明度,可以不设置
# binwidth = 10000, # 柱子的宽度。类似得也可以设置柱子的个数,如bins = 30
bins = 100, # 柱子的宽度。类似得也可以设置柱子的个数,如bins = 30
center = 0)
一个更加简单的方法:
####breaks是设置的步长
hist(x=INV$V4,breaks = 100)
只需要把每种类型的结构变异单独提取出来,就可以确定每个结构变异类型在染色体上的分布情况,
##for circos
# variation_number_in_bin.py
import sys
input_file = sys.argv[1]
step_len = 1000000
result = {}
chrom_stats = {
"chr01":43270923,
"chr02":35937250,
"chr03":36413819,
"chr04":35502694,
"chr05":29958434,
"chr06":31248787,
"chr07":29697621,
"chr08":28443022,
"chr09":23012720,
"chr10":23207287,
"chr11":29021106,
"chr12":27531856
}
for chrom in chrom_stats.keys():
step= 0
step_start = 0
result[chrom]={}
result[chrom][step]=0
for line in open(input_file):
if line.startswith(chrom):
pos = line.split()[1]
if step_start < int(pos) < (step_start + step_len):
result[chrom][step] += 1
if int(pos) >= (step_start + step_len):
step += 1
step_start += step_len
result[chrom][step] = 0
result[chrom][step] += 1
####这里改成了circos可以直接使用的输出
for steps,nums in result[chrom].items():
print(chrom, steps*1000000+1,(steps+1)*1000000, nums, sep="\t")