Files
Submissions-App/src/submissions/frontend/visualizations/irida_charts.py
2025-09-05 15:23:56 -05:00

65 lines
2.4 KiB
Python

"""
Functions for constructing irida control graphs using plotly.
"""
from datetime import date
from pprint import pformat
import logging, plotly.express as px, pandas as pd
from PyQt6.QtWidgets import QWidget
from . import CustomFigure
from tools import get_unique_values_in_df_column
logger = logging.getLogger(f"submissions.{__name__}")
class IridaFigure(CustomFigure):
def __init__(self, df: pd.DataFrame, modes: list, settings: dict, ytitle: str | None = None, parent: QWidget | None = None):
super().__init__(df=df, modes=modes, settings=settings)
self.df = df
self.construct_chart(df=df, modes=modes, start_date=settings['start_date'], end_date=settings['end_date'])
def construct_chart(self, df: pd.DataFrame, modes: list, start_date: date, end_date:date):
"""
Creates a plotly chart for control from a pandas dataframe
Args:
end_date ():
start_date ():
df (pd.DataFrame): input dataframe of control
modes (list): analysis modes to construct charts for
ytitle (str | None, optional): title on the y-axis. Defaults to None.
Returns:
Figure: output stacked bar chart.
"""
for ii, mode in enumerate(modes):
if "count" in mode:
df[mode] = pd.to_numeric(df[mode], errors='coerce')
color = "genus"
color_discrete_sequence = None
elif 'percent' in mode:
color = "genus"
color_discrete_sequence = None
else:
color = "target"
match get_unique_values_in_df_column(df, 'target'):
case ['Target']:
color_discrete_sequence = ["blue"]
case ['Off-target']:
color_discrete_sequence = ['red']
case _:
color_discrete_sequence = ['blue', 'red']
bar = px.bar(df,
x="submitted_date",
y=mode,
color=color,
title=mode,
barmode='stack',
hover_data=["genus", "name", "target", mode],
text="genera",
color_discrete_sequence=color_discrete_sequence
)
bar.update_traces(visible=ii == 0)
self.add_traces(bar.data)