diff --git a/8Knot/pages/codebase/visualizations/cntrb_file_heatmap.py b/8Knot/pages/codebase/visualizations/cntrb_file_heatmap.py index 081f335ea..ab3e3829f 100644 --- a/8Knot/pages/codebase/visualizations/cntrb_file_heatmap.py +++ b/8Knot/pages/codebase/visualizations/cntrb_file_heatmap.py @@ -7,8 +7,7 @@ import pandas as pd import logging from dateutil.relativedelta import * # type: ignore -import plotly.express as px -from pages.utils.graph_utils import get_graph_time_values, color_seq +from pages.utils.graph_utils import create_heatmap_figure, get_graph_time_values, color_seq from queries.contributors_query import contributors_query as cnq from queries.cntrb_per_file_query import cntrb_per_file_query as cpfq from queries.repo_files_query import repo_files_query as rfq @@ -332,18 +331,7 @@ def process_data( def create_figure(df: pd.DataFrame): - fig = px.imshow( - df, - labels=dict(x="Time", y="Directory Entries", color="Contributors"), - color_continuous_scale=px.colors.sequential.deep, - ) - - fig["layout"]["yaxis"]["tickmode"] = "linear" - fig["layout"]["height"] = 700 - fig["layout"]["coloraxis_colorbar_x"] = -0.15 - fig["layout"]["yaxis"]["side"] = "right" - - return fig + return create_heatmap_figure(df, color_label="Contributors") def df_file_clean(df_file: pd.DataFrame, df_file_cntbs: pd.DataFrame, bot_switch): diff --git a/8Knot/pages/codebase/visualizations/contribution_file_heatmap.py b/8Knot/pages/codebase/visualizations/contribution_file_heatmap.py index 59a86caa2..c6eb2caa1 100644 --- a/8Knot/pages/codebase/visualizations/contribution_file_heatmap.py +++ b/8Knot/pages/codebase/visualizations/contribution_file_heatmap.py @@ -7,7 +7,7 @@ import pandas as pd import logging from dateutil.relativedelta import * # type: ignore -import plotly.express as px +from pages.utils.graph_utils import create_heatmap_figure from queries.prs_query import prs_query as prq from queries.pr_files_query import pr_file_query as prfq from queries.repo_files_query import repo_files_query as rfq @@ -339,22 +339,8 @@ def process_data( def create_figure(df: pd.DataFrame, graph_view): - legend_title = "PRs Opened" - if graph_view == "merged_at": - legend_title = "PRs Merged" - - fig = px.imshow( - df, - labels=dict(x="Time", y="Directory Entries", color=legend_title), - color_continuous_scale=px.colors.sequential.deep, - ) - - fig["layout"]["yaxis"]["tickmode"] = "linear" - fig["layout"]["height"] = 700 - fig["layout"]["coloraxis_colorbar_x"] = -0.15 - fig["layout"]["yaxis"]["side"] = "right" - - return fig + color_label = "PRs Merged" if graph_view == "merged_at" else "PRs Opened" + return create_heatmap_figure(df, color_label=color_label) def df_file_clean(df_file: pd.DataFrame, df_file_pr: pd.DataFrame): diff --git a/8Knot/pages/codebase/visualizations/reviewer_file_heatmap.py b/8Knot/pages/codebase/visualizations/reviewer_file_heatmap.py index 9020eba30..dff17034a 100644 --- a/8Knot/pages/codebase/visualizations/reviewer_file_heatmap.py +++ b/8Knot/pages/codebase/visualizations/reviewer_file_heatmap.py @@ -7,8 +7,7 @@ import pandas as pd import logging from dateutil.relativedelta import * # type: ignore -import plotly.express as px -from pages.utils.graph_utils import get_graph_time_values, color_seq +from pages.utils.graph_utils import create_heatmap_figure, get_graph_time_values, color_seq from queries.contributors_query import contributors_query as cnq from queries.cntrb_per_file_query import cntrb_per_file_query as cpfq from queries.repo_files_query import repo_files_query as rfq @@ -332,18 +331,7 @@ def process_data( def create_figure(df: pd.DataFrame): - fig = px.imshow( - df, - labels=dict(x="Time", y="Directory Entries", color="Contributors"), - color_continuous_scale=px.colors.sequential.deep, - ) - - fig["layout"]["yaxis"]["tickmode"] = "linear" - fig["layout"]["height"] = 700 - fig["layout"]["coloraxis_colorbar_x"] = -0.15 - fig["layout"]["yaxis"]["side"] = "right" - - return fig + return create_heatmap_figure(df, color_label="Contributors") def df_file_clean(df_file: pd.DataFrame, df_file_cntbs: pd.DataFrame, bot_switch): diff --git a/8Knot/pages/utils/graph_utils.py b/8Knot/pages/utils/graph_utils.py index 6eb32b3c9..4f7460069 100644 --- a/8Knot/pages/utils/graph_utils.py +++ b/8Knot/pages/utils/graph_utils.py @@ -1,4 +1,6 @@ import datetime as dt +import pandas as pd +import plotly.express as px # list of graph color hex color_seq = [ @@ -25,6 +27,38 @@ "#B54708", # Yellow 700 - dark yellow ] +# Sequential color scale for heatmaps (light -> dark blue, matches app theme) +heatmap_color_scale = [baby_blue[0], baby_blue[2], baby_blue[4], baby_blue[6], baby_blue[8]] + + +def create_heatmap_figure( + df: pd.DataFrame, + color_label: str, + x_label: str = "Time", + y_label: str = "Directory Entries", +): + + fig = px.imshow( + df, + labels=dict(x=x_label, y=y_label, color=color_label), + color_continuous_scale=heatmap_color_scale, + ) + fig.update_layout( + height=700, + font=dict(size=14), + xaxis_title=x_label, + yaxis_title=y_label, + yaxis=dict(tickmode="linear", side="right"), + coloraxis_colorbar_x=-0.15, + coloraxis=dict( + colorbar=dict( + tickfont=dict(color="white"), + title=dict(font=dict(color="white")), + ) + ), + ) + return fig + def get_graph_time_values(interval): """