import sys
import argparse
import pandas as pd
import emodpy_hiv.plotting.plot_inset_chart as pic
from emodpy_hiv.plotting.channel_report import ChannelReport
[docs]def calculate_mean(dir_name: str):
"""
Calculate the mean of the InsetChart.json files in the given directory.
Args:
dir_name:
Directory with InsetChart.json files
Return:
mean_cr: Mean ChannelReport object
raw_data_list: List of raw data dictionaries from the InsetChart.json files
"""
not_used_filenames, raw_data_list = pic.get_data_from_directory(dir_name)
total_df = pd.DataFrame()
for data in raw_data_list:
df = ChannelReport.convert_to_df(data)
total_df = pd.concat([total_df, df])
mean_df = total_df.groupby("Time").mean().reset_index()
mean_cr = ChannelReport(df=mean_df)
mean_cr = mean_cr.convert_df_to_channel_report(df=mean_df)
return mean_cr, raw_data_list
[docs]def plot_mean(dir1: str,
dir2: str,
dir3: str,
title: str = None,
show_raw_data: bool = False,
subplot_index_min: int = 0,
subplot_index_max: int = 100,
output: str = None):
"""
Plot the mean of the InsetChart.json files in the given directories.
Args:
dir1:
Directory with InsetChart.json files
dir2:
Directory with InsetChart.json files
dir3:
Directory with InsetChart.json files
title:
Title of Plot
show_raw_data:
If true, shows the raw/individual simulation data in a lighter color.
subplot_index_min:
The index of the first subplot to show based on the alphabetical
order of the channels in the report.
subplot_index_min:
The index of the last subplot to show based on the alphabetical
order of the channels in the report.
output:
If provided, a directory will be created and images saved to the folder. If not provided, it opens windows.
Return:
None, if output is provided, an image will be saved to the output directory, else a window will be opened.
"""
dir_names = []
mean_data = []
raw_data_lists = []
if dir1 is not None:
dir_names.append(dir1)
mean_cr_1, raw_data_list_1 = calculate_mean(dir1)
mean_data.append(mean_cr_1)
raw_data_lists.append(raw_data_list_1)
if dir2 is not None:
dir_names.append(dir2)
mean_cr_2, raw_data_list_2 = calculate_mean(dir2)
mean_data.append(mean_cr_2)
raw_data_lists.append(raw_data_list_2)
if dir3 is not None:
dir_names.append(dir3)
mean_cr_3, raw_data_list_3 = calculate_mean(dir3)
mean_data.append(mean_cr_3)
raw_data_lists.append(raw_data_list_3)
plot_name = title
if plot_name is None:
plot_name = "InsetChart_Compare"
if title is None:
title = "" + pic.create_title_string(reference=None, data_filenames=dir_names)
if not show_raw_data:
raw_data_lists = None
pic.plot_data(title=title,
ref_data=None,
test_data=mean_data,
raw_data_list_of_lists=raw_data_lists,
test_filenames=dir_names,
subplot_index_min=subplot_index_min,
subplot_index_max=subplot_index_max,
img_dir=output,
plot_name=plot_name)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('dir1', default=None, nargs='?', help='Directory with InsetChart.json files')
parser.add_argument('dir2', default=None, nargs='?', help='Directory with InsetChart.json files')
parser.add_argument('dir3', default=None, nargs='?', help='Directory with InsetChart.json files')
parser.add_argument('-r', '--raw', help='If provided, shows the raw/individual simulation data in a lighter color.', action='store_true')
parser.add_argument('-m', '--subplot_index_min', default=0, type=int, help='Index of the first subplot to show.')
parser.add_argument('-x', '--subplot_index_max', default=100, type=int, help='Index of the last subplot to show.')
parser.add_argument('-t', '--title', default=None, help='Title of Plot')
parser.add_argument('-o', '--output', default=None, help='If provided, a directory will be created and images saved to the folder. If not provided, it opens windows.')
args = parser.parse_args()
if len(sys.argv) == 1:
parser.print_help()
sys.exit()
if args.subplot_index_min >= args.subplot_index_max:
print("Error: subplot_index_min must be less than subplot_index_max.")
sys.exit()
plot_mean(dir1=args.dir1,
dir2=args.dir2,
dir3=args.dir3,
title=args.title,
show_raw_data=args.raw,
subplot_index_min=args.subplot_index_min,
subplot_index_max=args.subplot_index_max,
output=args.output)