Pandas 在同一张图上绘制三个数据帧
Pandas plot three dataframes on the same figure
我尝试了很多不同的解决方案,但似乎无法解决问题。
我有九个数据框(每个 3 个描述一个系统):
df = pd.read_csv('purged_0.csv', sep=',', header=6, usecols=['Location', 'TOTAL', 'Unnamed: 19'])
df2 = pd.read_csv('purged_1.csv', sep=',', header=6, usecols=['Location', 'TOTAL', 'Unnamed: 19'])
df3 = pd.read_csv('purged_2.csv', sep=',', header=6, usecols=['Location', 'TOTAL', 'Unnamed: 19'])
...
df9 = pd.read_csv('purged_8.csv', sep=',', header=6, usecols=['Location', 'TOTAL', 'Unnamed: 19'])
看起来像这样:
TOTAL_x Unnamed: 19_x TOTAL_y Unnamed: 19_y TOTAL Unnamed: 19 total_mean error_mean
Location
LEU 455 -2.000507 0.043331 -1.822317 0.037883 -1.818721 0.030111 -1.880515 0.037108
PHE 456 -1.956130 0.041076 -2.305222 0.033210 -2.281509 0.042238 -2.180954 0.038842
ALA 475 -1.493856 0.085664 -2.950011 0.053675 -1.387676 0.068704 -1.943848 0.069348
GLY 476 -0.941795 0.079101 -2.383338 0.056897 -0.871813 0.062222 -1.398982 0.066073
PHE 486 -2.999369 0.081517 -3.688329 0.074005 -2.439233 0.093345 -3.042310 0.082956
ASN 487 -0.828214 0.080111 0.497831 0.029272 -0.969843 0.130934 -0.433409 0.080106
GLN 493 -1.323107 0.152173 -1.902454 0.121394 -2.320519 0.131299 -1.848694 0.134955
GLY 496 -0.603422 0.094210 0.069107 0.009226 0.120265 0.015929 -0.138017 0.039788
GLN 498 -2.692248 0.163207 -0.345707 0.051059 -1.610146 0.135108 -1.549367 0.116458
PRO 499 -0.256722 0.016657 0.042420 0.020137 -0.198196 0.011229 -0.137499 0.016008
THR 500 -0.650186 0.099639 -0.862829 0.113726 -0.996115 0.093840 -0.836377 0.102402
ASN 501 -3.513380 0.093578 -3.364489 0.090704 -4.055331 0.081724 -3.644400 0.088669
GLY 502 -1.011485 0.042847 -0.848697 0.054364 -0.712001 0.046970 -0.857395 0.048060
VAL 503 -0.680188 0.046426 -0.825084 0.082318 -0.635653 0.034014 -0.713642 0.054252
TYR 505 -1.868647 0.089418 -2.091676 0.084795 -1.777963 0.089681 -1.912762 0.087965
然后我将它们 3 乘 3 合并(argv 只是我用来更正标签的数字,没什么大不了的):
merge1 = pd.merge(df, df2, how='inner', on='Location')
merge2 = pd.merge(merge1, df3, how='inner', on='Location')
merge2 = merge2.loc[(df['TOTAL'] <= -0.25) & df['Location'].str.startswith("L")]
merge2.dropna(how='all', inplace=True)
merge2.set_index('Location', inplace=True)
merge2.index = merge2.index.str.split()
merge2.index = merge2.index.str[1] + ' ' + ((merge2.index.str[2].astype(int)) + int(sys.argv[10]) - 1).astype(str)
merge2['total_mean'] = merge2[['TOTAL_x', 'TOTAL_y', 'TOTAL']].mean(axis=1)
merge2['error_mean'] = merge2[['Unnamed: 19_x', 'Unnamed: 19_y', 'Unnamed: 19']].mean(axis=1)
我可以通过以下方式正确地绘制它们:
concat = pd.concat([merge2,merge4,merge6])
pd.DataFrame.plot(concat)
plt.show()
但是因为是比较,所以我想把所有的东西都画在同一个图上(像这样):
到目前为止,我已经尝试连接不同的数据帧,也尝试了 pyplot,并尝试了 pandas.DataFrame.plot:
plt.bar(merge2.index, merge2['total_mean'])
plt.bar(merge4.index, merge4['total_mean'])
plt.bar(merge6.index, merge4['total_mean'])
test = pd.merge(merge2, merge4, how='inner', on='Location')
test.plot(y='total_mean', kind='bar', yerr='error_mean', legend=False)
但是没有用。
我想绘制三个独立的合并数据帧(merged2(即(df+df2)+df3,merged4(df4+df5)+df6,merged6(df7+df8)+df9)只显示'total_mean' 列并使用 'error_mean' 作为错误栏。
我可以让它与一个一起工作,并且我可以独立地绘制它们,但是如果我试图让它们共享 y 轴,那将是一场彻底的灾难。
感谢您的帮助!
卢多维科
我简单地通过放置一个颜色数组来解决...它没有在任何地方指定但是当你连接时你可以通过添加一个像 color=['r', 'g' 这样的数组来保持原始颜色, 'b']).
这是我使用的修改,以防有人知道:
concat = pd.concat(merged_data_frames, axis=0, sort=True)
concat = concat.sort_index(key=lambda x: x.str.split().str[1].str.zfill(5))
concat.plot(kind='bar', y='total_mean', use_index=True, yerr='error_mean', edgecolor='black', color=['r', 'g', 'b'])
我尝试了很多不同的解决方案,但似乎无法解决问题。 我有九个数据框(每个 3 个描述一个系统):
df = pd.read_csv('purged_0.csv', sep=',', header=6, usecols=['Location', 'TOTAL', 'Unnamed: 19'])
df2 = pd.read_csv('purged_1.csv', sep=',', header=6, usecols=['Location', 'TOTAL', 'Unnamed: 19'])
df3 = pd.read_csv('purged_2.csv', sep=',', header=6, usecols=['Location', 'TOTAL', 'Unnamed: 19'])
...
df9 = pd.read_csv('purged_8.csv', sep=',', header=6, usecols=['Location', 'TOTAL', 'Unnamed: 19'])
看起来像这样:
TOTAL_x Unnamed: 19_x TOTAL_y Unnamed: 19_y TOTAL Unnamed: 19 total_mean error_mean
Location
LEU 455 -2.000507 0.043331 -1.822317 0.037883 -1.818721 0.030111 -1.880515 0.037108
PHE 456 -1.956130 0.041076 -2.305222 0.033210 -2.281509 0.042238 -2.180954 0.038842
ALA 475 -1.493856 0.085664 -2.950011 0.053675 -1.387676 0.068704 -1.943848 0.069348
GLY 476 -0.941795 0.079101 -2.383338 0.056897 -0.871813 0.062222 -1.398982 0.066073
PHE 486 -2.999369 0.081517 -3.688329 0.074005 -2.439233 0.093345 -3.042310 0.082956
ASN 487 -0.828214 0.080111 0.497831 0.029272 -0.969843 0.130934 -0.433409 0.080106
GLN 493 -1.323107 0.152173 -1.902454 0.121394 -2.320519 0.131299 -1.848694 0.134955
GLY 496 -0.603422 0.094210 0.069107 0.009226 0.120265 0.015929 -0.138017 0.039788
GLN 498 -2.692248 0.163207 -0.345707 0.051059 -1.610146 0.135108 -1.549367 0.116458
PRO 499 -0.256722 0.016657 0.042420 0.020137 -0.198196 0.011229 -0.137499 0.016008
THR 500 -0.650186 0.099639 -0.862829 0.113726 -0.996115 0.093840 -0.836377 0.102402
ASN 501 -3.513380 0.093578 -3.364489 0.090704 -4.055331 0.081724 -3.644400 0.088669
GLY 502 -1.011485 0.042847 -0.848697 0.054364 -0.712001 0.046970 -0.857395 0.048060
VAL 503 -0.680188 0.046426 -0.825084 0.082318 -0.635653 0.034014 -0.713642 0.054252
TYR 505 -1.868647 0.089418 -2.091676 0.084795 -1.777963 0.089681 -1.912762 0.087965
然后我将它们 3 乘 3 合并(argv 只是我用来更正标签的数字,没什么大不了的):
merge1 = pd.merge(df, df2, how='inner', on='Location')
merge2 = pd.merge(merge1, df3, how='inner', on='Location')
merge2 = merge2.loc[(df['TOTAL'] <= -0.25) & df['Location'].str.startswith("L")]
merge2.dropna(how='all', inplace=True)
merge2.set_index('Location', inplace=True)
merge2.index = merge2.index.str.split()
merge2.index = merge2.index.str[1] + ' ' + ((merge2.index.str[2].astype(int)) + int(sys.argv[10]) - 1).astype(str)
merge2['total_mean'] = merge2[['TOTAL_x', 'TOTAL_y', 'TOTAL']].mean(axis=1)
merge2['error_mean'] = merge2[['Unnamed: 19_x', 'Unnamed: 19_y', 'Unnamed: 19']].mean(axis=1)
我可以通过以下方式正确地绘制它们:
concat = pd.concat([merge2,merge4,merge6])
pd.DataFrame.plot(concat)
plt.show()
但是因为是比较,所以我想把所有的东西都画在同一个图上(像这样):
到目前为止,我已经尝试连接不同的数据帧,也尝试了 pyplot,并尝试了 pandas.DataFrame.plot:
plt.bar(merge2.index, merge2['total_mean'])
plt.bar(merge4.index, merge4['total_mean'])
plt.bar(merge6.index, merge4['total_mean'])
test = pd.merge(merge2, merge4, how='inner', on='Location')
test.plot(y='total_mean', kind='bar', yerr='error_mean', legend=False)
但是没有用。
我想绘制三个独立的合并数据帧(merged2(即(df+df2)+df3,merged4(df4+df5)+df6,merged6(df7+df8)+df9)只显示'total_mean' 列并使用 'error_mean' 作为错误栏。
我可以让它与一个一起工作,并且我可以独立地绘制它们,但是如果我试图让它们共享 y 轴,那将是一场彻底的灾难。
感谢您的帮助!
卢多维科
我简单地通过放置一个颜色数组来解决...它没有在任何地方指定但是当你连接时你可以通过添加一个像 color=['r', 'g' 这样的数组来保持原始颜色, 'b']). 这是我使用的修改,以防有人知道:
concat = pd.concat(merged_data_frames, axis=0, sort=True)
concat = concat.sort_index(key=lambda x: x.str.split().str[1].str.zfill(5))
concat.plot(kind='bar', y='total_mean', use_index=True, yerr='error_mean', edgecolor='black', color=['r', 'g', 'b'])