Python 如何使用行号作为存储箱绘制直方图?

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

我试图绘制一组基因的全基因组相互作用数据的柱状图。当我打印或保存到csv时,Dataframe显示正确,但当我尝试创建直方图时,装箱错误,值显示不正确。为了提高效率,有很多事情需要清理,因为我现在只是想让它工作,但我相信你可以看到我在代码方面的经验不足,因为这不是世界上最优雅的事情

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