Python 如何使用行号作为存储箱绘制直方图?
我试图绘制一组基因的全基因组相互作用数据的柱状图。当我打印或保存到csv时,Dataframe显示正确,但当我尝试创建直方图时,装箱错误,值显示不正确。为了提高效率,有很多事情需要清理,因为我现在只是想让它工作,但我相信你可以看到我在代码方面的经验不足,因为这不是世界上最优雅的事情Python 如何使用行号作为存储箱绘制直方图?,python,pandas,histogram,Python,Pandas,Histogram,我试图绘制一组基因的全基因组相互作用数据的柱状图。当我打印或保存到csv时,Dataframe显示正确,但当我尝试创建直方图时,装箱错误,值显示不正确。为了提高效率,有很多事情需要清理,因为我现在只是想让它工作,但我相信你可以看到我在代码方面的经验不足,因为这不是世界上最优雅的事情 def plot_data(): args = parse_args(sys.argv[1:]) genes = csv.reader(open(args.genes, 'r'), delimiter
def plot_data():
args = parse_args(sys.argv[1:])
genes = csv.reader(open(args.genes, 'r'), delimiter='\t')
out = csv.reader(open(args.output, 'r'), delimiter='\t')
arr1 = []
arr2 = []
for x in out: # create two separate lists to drop duplicates and create a single ordered coordinate column in Dataframe
arr1.append(str(x[0]) + "\t" + str(x[2]) + "\t" + str(x[3]))
arr2.append(str(x[1]) + "\t" + str(x[2]) + "\t" + str(x[3]))
df1 = pd.DataFrame([x.split('\t') for x in arr1], columns=['c1', 'contacts', 'gene']).drop_duplicates(('gene', 'c1'), keep=False)
df2 = pd.DataFrame([x.split('\t') for x in arr2], columns=['c2', 'contacts', 'gene']).drop_duplicates(('gene', 'c2'), keep=False)
dfm = df1.merge(df2, left_on=['contacts','gene'], right_on = ['contacts','gene'], how='outer').fillna(0)
dfm[['c1', 'c2']] = dfm[['c1', 'c2']].apply(pd.to_numeric) # change 'c1' and 'c2' values to int64 numeric values
dfm['c'] = dfm['c1'] + dfm['c2'] # create index by summing 'c1' and 'c2' indices
dfm = dfm[['c', 'contacts', 'gene']] # drop 'c1' and 'c2' columns and keep the merged 'c' column
dfm = dfm.pivot(index='c', columns='gene', values='contacts').fillna(0).reindex(dfm.index, fill_value=0).apply(pd.to_numeric) # re-arranges dataframe so that 'gene' is the column name and 'c' is the row index
dfm = dfm[dfm.index <= 2337] # remove rows with 'c' greater than 2337
dfm = dfm[dfm.index > 0] # remove 0 row from 'c'
num_bins = len(dfm.index)
dfm.hist(bins=num_bins, sharex=True, sharey=True)
plt.xlabel("Bin number", fontsize=12)
plt.ylabel("Interaction count", fontsize=12)
plt.yscale('log')
plt.show()
plot = plot_data()
由于某些原因,当我运行此命令时,我得到的输出没有在正确的位置显示0值(来自数据帧),而其他值似乎不正确。考虑到应该有2337个箱子,装箱是很奇怪的,但是x轴超过了2500。下面是一个这样的柱状图示例(抱歉,刚刚创建了帐户):
我可能在代码中遗漏了一些明显的错误,但从昨天起我就一直坚持这一点。垃圾箱的数量和范围是不同的。正如您在函数中指定的那样,可能有2337个箱子,但箱子的范围是定义x轴的因素,而不是箱子的数量。是否有办法将每一行指定为一个箱子?不清楚您试图可视化什么。拿
dfm.loc[1,:]
(dfm.loc[1,['gene1','gene2','gene3']
)-你说你想把它变成一个箱子,那一行的数据应该如何显示?我想每个基因都有一个单独的柱状图,x轴是基因组坐标(即第一列),y轴是接触计数(即行中的每个值)。对于这些数据,我有三个直方图,共2337个箱子,每个基因组坐标对应一个。
gene1 gene2 gene3
1 2498.44 741.13 78.07
2 0.0 799.87 113.44
3 1463.36 1715.41 83.52
4 799.83 0.0 140.63
5 476.46 1138.58 105.91
6 353.92 667.51 125.78
7 349.17 335.82 114.90
8 0.0 0.0 0.0
9 179.30 287.71 126.03
10 139.17 207.05 67.16
11 95.32 94.28 69.63
12 64.50 66.24 25.24
13 38.83 67.29 28.50
14 27.85 48.96 29.81
15 37.86 51.28 17.29
16 18.80 42.25 16.09
17 39.28 29.57 21.91
18 22.02 37.41 13.73
19 17.02 38.08 10.41
20 27.27 20.55 14.17