单纯的就是完成个作业,之前的小作业都是借鉴的同学的代码(别向我学这个hhhhh),第一次写博客,请多指教!
下面是正题:
附表等位基因中的行表示10个病人样本,列表示DNA片段中的15个位点,试着将碱基出现频率可视化(有时间我把表格上传到资源里大家可以试着练一下)
表格为10(人数)*15(等位基因的位点)
首先,分析一下需要做的工作有哪些:
1.将表格读到内存里
2.循环统计每一列每一个碱基出现次数并记录下来
3.作图
import pandas as pd
data = pd.read_excel('gene.xlsx')
顺便简单介绍一下相关表格操作:
参考博客:利用Python处理Excel数据 这里只列出了需要的一部分功能
df.shape
输出:(10,15)
意义:10行15列
#行数0-4,列数0-5
df.iloc[:4, :5]
#[0, 2, 5] 代表指定的行,[ 4, 5 ] 代表指定的列
df.iloc[[0,2,5],[4,5]]
先定义4个空列表A、T、C、G,然后循环一次往里面添加一组数据(出现次数*0.1=每个碱基的频率)
A = []
T = []
G = []
C = []
for i in range(15):#15列
x.append(i)
seq = data.iloc[0:10, i]#每次读取一列
base = {'A': 0, 'T': 0, 'C': 0, 'G': 0}
for nucl in range(len(seq)):
if seq[nucl] in base:
base[seq[nucl]] += 1
for each in sorted(base.keys()):
if(each == 'A'):
A.append(base[each]*0.1)
elif (each == 'T'):
T.append(base[each]*0.1)
elif (each == 'C'):
C.append(base[each]*0.1)
elif (each == 'G'):
G.append(base[each]*0.1)
搜了半天才知道需要作的图名字叫堆积柱状图,说白了就是另外一组的数据堆在前面的数据的上面
参考博客:【Python】画个堆积柱状图(三类数据的)
特别注意:
地方就是在设置第三类数据的底部,应该是第一类加第二类作底部,同理第四类也要在第三类基础上加合。
for i in range(0, len(A)):
T[i] = T[i] + A[i]
plt.bar(x, C, align="center", bottom=T, color="#0080FF", label="C")
import matplotlib.pyplot as plt
plt.bar(x, A, align="center", color="#FFFF00", tick_label=['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15'], label="A")
plt.bar(x, T, align="center", bottom=A, color="#00FF00", label="T")
for i in range(0, len(A)):
T[i] = T[i] + A[i]
plt.bar(x, C, align="center", bottom=T, color="#0080FF", label="C")
for i in range(0, len(A)):
C[i] = C[i] + T[i]
plt.bar(x, G, align="center", bottom=C, color="#FF0000", label="G")
plt.xlabel("gene")
plt.ylabel("number")
plt.legend()
plt.show()
可能没讲明白,可以试试把for循环的部分删去画出图,可以发现频率的和不等于1,也就是堆积柱状图的底没有选对。可以将上面的代码改成这部分再运行,就可以看到后面有bug的结果了
import matplotlib.pyplot as plt
plt.bar(x, A, align="center", color="#FFFF00", tick_label=['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15'], label="A")
plt.bar(x, T, align="center", bottom=A, color="#00FF00", label="T")
plt.bar(x, C, align="center", bottom=T, color="#0080FF", label="C")
plt.bar(x, G, align="center", bottom=C, color="#FF0000", label="G")
plt.xlabel("gene")
plt.ylabel("number")
plt.legend()
plt.show()
错误图例
很明显,这个有些频率没有达到1,就是这个bug的问题了
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams["font.sans-serif"] = ["SimHei"]
mpl.rcParams["axes.unicode_minus"] = False
data = pd.read_excel('gene.xlsx')
x = []
A = []
T = []
G = []
C = []
for i in range(15):
x.append(i)
seq = data.iloc[0:10, i]
base = {'A': 0, 'T': 0, 'C': 0, 'G': 0}
for nucl in range(len(seq)):
if seq[nucl] in base:
base[seq[nucl]] += 1
for each in sorted(base.keys()):
if each == 'A':
A.append(base[each]*0.1)
elif each == 'T':
T.append(base[each]*0.1)
elif each == 'C':
C.append(base[each]*0.1)
elif each == 'G':
G.append(base[each]*0.1)
plt.bar(x, A, align="center", color="#FFFF00", tick_label=['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15'], label="A")
plt.bar(x, T, align="center", bottom=A, color="#00FF00", label="T")
for i in range(0, len(A)):
T[i] = T[i] + A[i]
plt.bar(x, C, align="center", bottom=T, color="#0080FF", label="C")
for i in range(0, len(A)):
C[i] = C[i] + T[i]
plt.bar(x, G, align="center", bottom=C, color="#FF0000", label="G")
plt.xlabel("gene")
plt.ylabel("number")
plt.legend()
plt.show()
笔者算python小白,代码有很多部分可以优化但是不大会,算是笔者第一次写python吧,如觉着代码有问题之类的请留言,感谢!