AudiogramDigitization / src /plot_audiogram.py
weiren119's picture
Feat: app.py
34acdd0
raw
history blame
2.51 kB
#!/usr/bin/env python3
"""
Copyright (c) 2022, Carleton University Biomedical Informatics Collaboratory
This source code is licensed under the MIT license found in the
LICENSE file in the root directory of this source tree.
"""
from argparse import ArgumentParser
import json
from matplotlib.offsetbox import OffsetImage, AnnotationBbox
import matplotlib.pyplot as plt
import pandas as pd
def load_image(path, zoom=1):
return OffsetImage(plt.imread(path), zoom=zoom)
def main(args):
thresholds = pd.DataFrame(json.load(open(args.input)))
# Figure
fig = plt.figure()
ax = fig.add_subplot(111)
# x axis
axis = [250, 500, 1000, 2000, 4000, 8000, 16000]
ax.set_xscale('log')
ax.xaxis.tick_top()
ax.xaxis.set_major_formatter(plt.FuncFormatter('{:.0f}'.format))
ax.set_xlabel('Frequency (Hz)')
ax.xaxis.set_label_position('top')
ax.set_xlim(125,16000)
plt.xticks(axis)
# y axis
ax.set_ylim(-20, 120)
ax.invert_yaxis()
ax.set_ylabel('Threshold (dB HL)')
plt.grid()
for conduction in ("air", "bone"):
for masking in (True, False):
for ear in ("left", "right"):
symbol_name = f"{ear}_{conduction}_{'unmasked' if not masking else 'masked'}"
selection = thresholds[(thresholds.conduction == conduction) & (thresholds.ear == ear) & (thresholds.masking == masking)]
selection = selection.sort_values("frequency")
# Plot the symbols
for i, threshold in selection.iterrows():
ab = AnnotationBbox(load_image(f"src/digitizer/assets/symbols/{symbol_name}.png", zoom=0.1), (threshold.frequency, threshold.threshold), frameon=False)
ax.add_artist(ab)
# Add joining line for air conduction thresholds
if conduction == "air":
plt.plot(selection.frequency, selection.threshold, color="red" if ear == "right" else "blue", linewidth=0.5)
# Save audiogram plot to PNG
output = args.output
if not output.endswith(".png"):
output = output.split(".")[0] + ".png"
plt.savefig(output)
if __name__ == "__main__":
parser = ArgumentParser()
parser.add_argument("-i", "--input", type=str, required=True, help="Path to the JSON file of the digitized audiogram.")
parser.add_argument("-o", "--output", type=str, required=True, help="Where the output file should be saved.")
args = parser.parse_args()
main(args)