barplot.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. import argparse
  2. from matplotlib import pyplot
  3. import pandas
  4. import seaborn
  5. from freesurfer_volume_reader.freesurfer import HippocampalSubfieldsVolumeFile
  6. def abbreviate_analysis_id(analysis_id):
  7. return analysis_id.split('_')[0] if analysis_id else None
  8. def main():
  9. argparser = argparse.ArgumentParser()
  10. argparser.add_argument('--subject', required=True)
  11. argparser.add_argument('--subjects-dir', dest='subjects_dir_path', required=True)
  12. args = argparser.parse_args()
  13. volume_frame = pandas.concat(f.read_volumes_dataframe() for f in
  14. HippocampalSubfieldsVolumeFile.find(args.subjects_dir_path))
  15. volume_frame = volume_frame[volume_frame['subject'] == args.subject]
  16. volume_frame['subfield_segmentation_mode'] = volume_frame.apply(
  17. lambda row: ' & '.join(filter(None, ('T1' if row['T1_input'] else None,
  18. abbreviate_analysis_id(row['analysis_id'])))),
  19. axis=1,
  20. )
  21. volume_frame.to_csv('hippocampal_subfield_volumes_{}.csv'.format(args.subject), index=False)
  22. volume_frame.drop(columns=['subject', 'T1_input', 'analysis_id'], inplace=True)
  23. print(volume_frame)
  24. volume_frame.sort_values(['subfield_segmentation_mode', 'subfield'], inplace=True)
  25. seaborn.set(font_scale=0.3)
  26. volume_frame_subfields = volume_frame[volume_frame['subfield'] != 'Whole_hippocampus']
  27. for hemisphere in ['left', 'right']:
  28. pyplot.ylim(0, 750)
  29. ax = seaborn.barplot(data=volume_frame_subfields[volume_frame_subfields['hemisphere'] == hemisphere],
  30. x='subfield', y='volume_mm^3',
  31. hue='subfield_segmentation_mode')
  32. ax.set_title('Hippocampal Subfield Volumes of Subject {}'.format(args.subject)
  33. + '\n{} Hemisphere'.format(str.capitalize(hemisphere)))
  34. pyplot.savefig('hippocampal_subfield_volumes_{}_{}.png'.format(args.subject, hemisphere))
  35. pyplot.clf()
  36. seaborn.set(font_scale=0.4)
  37. ax = seaborn.barplot(data=volume_frame[volume_frame['subfield'] == 'Whole_hippocampus'],
  38. x='hemisphere', y='volume_mm^3',
  39. hue='subfield_segmentation_mode')
  40. ax.set_title('Hippocampal Volume of Subject {}'.format(args.subject))
  41. pyplot.savefig('hippocampal_volume_{}.png'.format(args.subject))
  42. if __name__ == '__main__':
  43. main()