我有一组数据,我将这些数据转换为将数据组放入行中,并在列中包含占位符值(对于我的情况,系列质量值)。我的下一个目标是绘制包含相同字符的每一行的直方图,如下所示:
mz 902.4 909.4 915.3
n 0.6 0.3 1.4
n.1 0.4 0.3 1.3
n.2 0.3 0.2 1.1
n.3 0.2 0.2 1.3
n.4 0.4 0.3 1.4
DCIS 0.3 1.6
DCIS.1 0.3 1.2
DCIS.2 1.1
DCIS.3 0.2 1.2
DCIS.4 0.2 1.3
DCIS.5 0.2 0.1 1.5
br_1 0.5 0.4 1.4
br_1.1 0.2 1.3
br_1.2 0.5 0.2 1.4
br_1.3 0.5 0.2 1.6
br_1.4 1.4
我的目标是从902.4开始绘制直方图,其中字母n为组1,DCIS为组2,等等,这些组将在同一直方图中。然后我计划通过列迭代相同的过程,因此代码应该生成相同数量的直方图列。
以下是我的代码(输入文件是转置前的excel xlsx文件):
nh = pd.ExcelFile(nheight)
df = pd.read_excel(nh, index=False)
dfn = df.filter(like='n', axis=0)
dfbr1234 = df.filter(like='br', axis=0)
plt.figure()
plt.hist([dfn, dfbr1234], bins=50)
plt.show()
我试图将带有字母'br'的行组合在一起用于测试,但是它产生零大小的数组以减少操作最小值,没有身份错误。
编辑: 所以数据框就是上面的表格。
我想要做的是绘制一个直方图,其中包含3个单独的直方图,这些直方图由上面屏幕截图中的黑色,红色和橙色框指定。目标是比较单个绘图中的不同框,我想迭代,以便我可以对其他两个列(图片中的第2列和第3列)执行相同操作。我尝试使用df.filter函数来过滤'like ='n''等等,但我不确定如何组合不同的过滤数据以及迭代列。上面的代码还没有迭代,但我正在考虑使用iloc [:,variable]进行迭代。
答案 0 :(得分:2)
这是一种基本方法,
df = pd.read_clipboard()
df = df.fillna(0)
print(df)
mz 902.4 909.4 915.3
0 n 0.6 0.3 1.4
1 n.1 0.4 0.3 1.3
2 n.2 0.3 0.2 1.1
3 n.3 0.2 0.2 1.3
4 n.4 0.4 0.3 1.4
5 DCIS 0.3 1.6 0.0
6 DCIS.1 0.3 1.2 0.0
7 DCIS.2 1.1 0.0 0.0
8 DCIS.3 0.2 1.2 0.0
9 DCIS.4 0.2 1.3 0.0
10 DCIS.5 0.2 0.1 1.5
11 br_1 0.5 0.4 1.4
12 br_1.1 0.2 1.3 0.0
13 br_1.2 0.5 0.2 1.4
14 br_1.3 0.5 0.2 1.6
15 br_1.4 1.4 0.0 0.0
制作子集(如果可以很好地定义逻辑,则可以将此步骤引入到下面的迭代中),
df_n = df.loc[df['mz'].str.startswith('n')]
df_D = df.loc[df['mz'].str.startswith('D')]
df_b = df.loc[df['mz'].str.startswith('b')]
使用matplotlib
' s subplots()
import matplotlib.pyplot as plt
fig, ax = plt.subplots(nrows=df.shape[1]-1,ncols=1)
plt.tight_layout()
for i in range(1,df.shape[1]):
df_n.iloc[:,i].hist(ax=ax[i-1],color = 'k', alpha=0.4) # reduced alpha because you're plotting many histograms on top of each other
df_D.iloc[:,i].hist(ax=ax[i-1],color = 'r', alpha=0.4)
df_b.iloc[:,i].hist(ax=ax[i-1],color = 'orange', alpha=0.4)
ax[i-1].set_title("Histograms for " + df.columns[i])