def plot_openness_by_hour(data: list, period: dict, ax: Axes): """ Plots the openness by hour from the raw data. :param data: Raw data :param period: Period over which to average the openness :param ax: Axes object in which to put the plot :return: None """ num_hrs = 24 # Get data hour_bins = get_openness_by_hour(data, period) # Plot bar chart ax.bar(range(num_hrs + 1), hour_bins) # Decorate the axes ax.yaxis.grid(True, which="both", linestyle="-.") ax.set_xlim(1, num_hrs) ax.set_xticks(range(num_hrs + 1)) ax.set_xticklabels([f"{t:02d}" for t in ax.get_xticks()]) ax.set_yticklabels([f"{o * 100:.1f}{percent()}" for o in ax.get_yticks()]) ax.set_ylabel("Andel åpen") ax.set_xlabel("Tid på døgnet")
def plot_openness_by_weekday_by_semester(period: dict, ax: Axes): """ Plot openness by semester. :param period: Period over which to average the openness :param ax: Axes object in which to put the plot :return: None """ # Configuration num_weekdays = 5 init_year = 2015 init_semester = "Vår" # Get data for plot dataseries = get_openness_by_weekday_by_semester(period) num_series = len(dataseries) bar_width = 1 / (num_series + 1) # Create plot cur_year = init_year cur_semester = init_semester legend = [] for semester_index, week_bins in enumerate(dataseries): # Add bars ax.bar( [ weekday_index + semester_index * bar_width for weekday_index in range(num_weekdays) ], height=week_bins[:num_weekdays], width=bar_width, ) # Add to legend legend.append(f"{cur_semester} {cur_year}") # Update semester and year for next bars if cur_semester == "Høst": cur_semester = "Vår" cur_year += 1 else: cur_semester = "Høst" # Place legend and labels ax.legend(legend, loc="lower right") ax.set_xticklabels(("", "Mandag", "Tirsdag", "Onsdag", "Torsdag", "Fredag")) ax.set_yticklabels( [f"{openness * 100:.1f}{percent()}" for openness in ax.get_yticks()] ) ax.set_ylabel("Andel åpen")
def plot_openness_by_weekday(data: list, period: dict, ax: Axes): """ Plot the openness by weekday from the raw data. :param data: Raw data :param period: Period over which to average the openness :param ax: Axes object in which to put the plot :return: None """ week_bins = get_openness_by_weekday(data, period) weekday_avg = sum(week_bins[0:5]) / 5 weekend_avg = sum(week_bins[5:7]) / 2 # Plot bar ax.bar(range(7), week_bins) # Plot averages ax.text( 2, weekday_avg * 1.05, f"Gjennomsnitt ukedager: {weekday_avg * 100:.0f}{percent()}", ) ax.text( 4.5, weekend_avg * 1.1, f"Gjennomsnitt helgedager: {weekend_avg * 100:.0f}{percent()}", ) ax.plot((0, 5 - 1), (weekday_avg, weekday_avg), "k--") ax.plot((5, 7 - 1), (weekend_avg, weekend_avg), "k--") # Decorate axes ax.set_xticklabels( ("", "Mandag", "Tirsdag", "Onsdag", "Torsdag", "Fredag", "Lørdag", "Søndag") ) ax.set_yticklabels( [f"{openness * 100:.1f}{percent()}" for openness in ax.get_yticks()] ) ax.set_ylabel("Andel åpen")
def cohort_bar(cohort_averages: dict, cohort_data: dict, observable: str, yaxis_upper: int = None, ax: matplotlib.axes = None, labelsize: int = 12, ticksize: int = 10, legendsize: int = 8, markersize=15) -> None: """Plots either the V- or J-gene usages. Parameters ---------- cohort_averages : dict Dictionary of averages and variations within a cohort for all severities. cohort_dict : dict Dictionary of all statistics of all individuals in a cohort for all severities. observable : str The quantity which is going to be plotted. yaxis_upper : int, optional Specifies the upper limit of the y-axis on the plot. ax : matplotlib.axes, optional Used to modify an already existing axes when creating a figure with a grid. labelsize : int, optional Size of axes labels. ticksize : int, optional Size of tick labels. legendsize : int, optional Specifies font size of strings in legend. Returns ------- None """ if ax is None: fig = plt.figure(dpi=300, figsize=(16, 4)) ax = fig.add_subplot(111) # Give the bars for each gene some space among each other. width = 1.0 / len(cohort_averages) - 0.02 bars = [] if 'Asymptomatic' in cohort_averages: ordering = ['Healthy', 'Mild', 'Moderate', 'Severe', 'Asymptomatic'] else: ordering = sorted(cohort_averages.keys()) # Sort the genes by descending usage in the healthy cohort. if 'Briney/GRP' in cohort_averages: sorted_genes = [ gene for _, gene in sorted(zip( cohort_averages['Briney/GRP'][observable][0], cohort_averages['Briney/GRP'][observable][-1]), key=lambda pair: pair[0], reverse=True) ] else: sorted_genes = [ gene for _, gene in sorted(zip( cohort_averages['Healthy'][observable][0], cohort_averages['Healthy'][observable][-1]), key=lambda pair: pair[0], reverse=True) ] # Because there are so many V genes, plot only those which have at least # 1% average usage in at least one cohort. if 'v' in observable: good_genes = [] for gene in sorted_genes: bools = 0 for severity in cohort_averages: idx = cohort_averages[severity][observable][-1].index(gene) value = cohort_averages[severity][observable][0][idx] bools += value >= 0.01 if bools != 0: good_genes.append(gene) else: good_genes = sorted_genes xlabels = good_genes default_x = np.arange(0, len(good_genes), 1) xs, ys = [], [] for i, severity in enumerate(ordering): x = default_x + width * i xs.append(x) indices = [ cohort_averages[severity][observable][-1].index(gene) for gene in good_genes ] y = [cohort_averages[severity][observable][0][k] for k in indices] ys.append(y) if observable == 'v gene': ax.set_xlim(-0.3, xs[0][-1] + 1.0) if yaxis_upper is not None: ax.set_ylim(0, yaxis_upper) else: ax.set_ylim(0, 0.35) else: ax.set_xlim(-0.3, xs[0][-1] + 1.0) if yaxis_upper is not None: ax.set_ylim(0, yaxis_upper) else: ax.set_ylim(0, 0.55) # Specifiy location of xticks as being in the middle of the grouping of bars. middle = np.mean(np.arange(0, len(cohort_averages))) middle_xticks = default_x + middle * width ax.set_xticks(middle_xticks) ax.set_xticklabels(xlabels, rotation=90, family='Arial') ax.set_ylabel('relative counts', fontname="Arial") # Plot the bars. for i, severity in enumerate(ordering): bar = ax.bar(xs[i], ys[i], width, color=colors[severity], label=severity) for d in cohort_data[severity][observable]: # Plot the full distributions of values to get a better sense # of variation within cohorts. for gidx, rect in enumerate(bar): ax.scatter(xs[i][gidx], d[good_genes[gidx]], marker='.', color=lightercolors[severity], zorder=3, s=markersize, edgecolors='black', linewidths=0.3) format_axes(ax, labelsize=labelsize, ticksize=ticksize, legendsize=legendsize)