218 lines
6.4 KiB
Python
218 lines
6.4 KiB
Python
import matplotlib.pyplot as plt
|
|
import numpy as np
|
|
|
|
plt.rcParams['font.family'] = 'serif'
|
|
plt.rcParams['font.size'] = 12
|
|
|
|
def generate_measurement_stats_pie_chart(show: bool, save: bool):
|
|
fig, ax = plt.subplots()
|
|
|
|
size_outer = 0.3
|
|
size_inner = 0.2
|
|
|
|
vals_outer = np.array([28., 7.]) # Measurements vs Measurement failures
|
|
vals_middle = np.array([17., 11., 7., 0.]) # MEWS calculations, Measurement only, P2 failures, P1 failures
|
|
vals_inner = np.array([16., 1., 8., 3., 2., 5., 0., 0.]) # Innermost ring values
|
|
|
|
cmap = plt.get_cmap("tab20b")
|
|
outer_colors = cmap(np.array([6, 13]))
|
|
middle_colors = cmap(np.array([5, 15, 14, 14]))
|
|
inner_colors = cmap(np.array([11, 10, 11, 10, 11, 10, 11, 10]))
|
|
|
|
# Outer ring
|
|
ax.pie(vals_outer, radius=1, colors=outer_colors,
|
|
wedgeprops=dict(width=size_outer, edgecolor='w'))
|
|
|
|
# Middle ring
|
|
ax.pie(vals_middle, radius=1-size_outer, colors=middle_colors,
|
|
wedgeprops=dict(width=size_inner, edgecolor='w'))
|
|
|
|
# Innermost ring
|
|
inner_pie = ax.pie(vals_inner, radius=1-size_outer-size_inner, colors=inner_colors,
|
|
wedgeprops=dict(width=size_inner, edgecolor='w'))
|
|
#labels_inner = ["home", "on the go"]
|
|
#ax.legend(inner_pie[0], labels_inner, loc="center right")
|
|
|
|
ax.set(aspect="equal")
|
|
|
|
if save:
|
|
plt.savefig(
|
|
"chart-measurement-stats.png",
|
|
dpi=900,
|
|
bbox_inches='tight',
|
|
transparent=True
|
|
)
|
|
|
|
if show:
|
|
plt.show()
|
|
|
|
|
|
def generate_measurement_repeats_histogram(show: bool, save: bool):
|
|
device_names = ["Scanwatch", "BPM Core", "Thermo"]
|
|
labels_attempts = [f"{name} measurement attempts" for name in device_names]
|
|
labels_failures = ["S\u2081 failures", "B\u2081 failures", "T\u2081 failures"]
|
|
values_attempts = [43, 33, 28]
|
|
values_failures = [15, 5, 0]
|
|
|
|
# Define a list of colors for the bars
|
|
cmap = plt.get_cmap("tab20b")
|
|
colors_attempts = cmap(np.array([15, 11, 7]))
|
|
colors_failures = cmap(np.array([13, 9, 5]))
|
|
|
|
# Plot the bars with the specified colors and labels for the legend
|
|
bars_attempts = plt.bar(device_names, values_attempts, color=colors_attempts)
|
|
bars_failures = plt.bar(device_names, values_failures, color=colors_failures)
|
|
|
|
# Add individual labels for each bar in the legend
|
|
for i in range(3):
|
|
bars_attempts[i].set_label(labels_attempts[i])
|
|
bars_failures[i].set_label(labels_failures[i])
|
|
|
|
plt.ylabel("Count")
|
|
|
|
plt.ylim(0, 55)
|
|
plt.yticks(range(0, 56, 5))
|
|
|
|
plt.legend(loc="upper right", prop={"size":8})
|
|
|
|
if save:
|
|
plt.savefig(
|
|
"chart-measurement-repeats.png",
|
|
dpi=900,
|
|
bbox_inches="tight",
|
|
transparent=True
|
|
)
|
|
|
|
if show:
|
|
plt.show()
|
|
|
|
|
|
def generate_connection_boxplots(show: bool, save: bool):
|
|
data_downlink = [
|
|
[50.42, 46.29, 39.94, 39.44, 50.21, 44.34, 41.03, 47.88, 50.34, 41.72, 43.93, 49.34, 50.49, 52.47, 47.04, 45.86, 51.17, 50.12, 52.16, 50.55, 50.69, 53.43, 42.21, 46.81],
|
|
[15.3, 25.47, 33.91, 12.27]
|
|
]
|
|
data_uplink = [
|
|
[11.38, 11.24, 8.46, 9.33, 11.39, 9.33, 9.03, 10.65, 11.59, 8.81, 8.91, 10.56, 10.98, 10.04, 9.11, 8.62, 11.08, 10.62, 11.24, 11.29, 10.86, 10.46, 9.16, 9.15],
|
|
[5.33, 5.46, 3.38, 4.23]
|
|
]
|
|
data_rtt = [
|
|
[14, 16, 15, 15, 15, 15, 16, 12, 15, 14, 18, 14, 19, 16, 23, 12, 16, 14, 12, 13, 13, 13, 17, 15],
|
|
[145, 127, 104, 108]
|
|
]
|
|
|
|
fig, axes = plt.subplots(nrows=1, ncols=3, sharex=True, figsize=(15,5))
|
|
#plt.subplots_adjust(wspace=0.4)
|
|
|
|
cmap = plt.get_cmap("tab20b")
|
|
|
|
medianprops= {
|
|
"color": cmap(1),
|
|
"linewidth": 2,
|
|
}
|
|
|
|
# Downlink Boxplot
|
|
axes[1].boxplot(data_downlink, medianprops=medianprops)
|
|
axes[1].set_ylabel("Datarate [Mbps]")
|
|
axes[1].set_title("Downlink")
|
|
axes[1].set_xticks([1, 2])
|
|
axes[1].set_xticklabels(["At home", "On the go"])
|
|
|
|
# Uplink Boxplot
|
|
axes[0].boxplot(data_uplink, medianprops=medianprops)
|
|
axes[0].set_ylabel("Datarate [Mbps]")
|
|
axes[0].set_title("Uplink")
|
|
axes[0].set_xticks([1, 2])
|
|
axes[0].set_xticklabels(["At home", "On the go"])
|
|
|
|
# RTT Boxplot
|
|
axes[2].boxplot(data_rtt, medianprops=medianprops)
|
|
axes[2].set_ylabel("RTT [ms]")
|
|
axes[2].set_title("RTT")
|
|
axes[2].set_xticks([1, 2])
|
|
axes[2].set_xticklabels(["At home", "On the go"])
|
|
|
|
# Function to add jitter
|
|
def jitter(x, width=0.1):
|
|
"""Return the given x coordinate plus a small random offset."""
|
|
np.random.seed = 0
|
|
return x + np.random.uniform(-width, width)
|
|
|
|
# Sample points to plot on the boxplots
|
|
points_uplink = [
|
|
(1, 11.38),
|
|
(2, 5.33),
|
|
(1, 9.33),
|
|
(2, 5.46),
|
|
(1, 11.59),
|
|
(1, 10.56),
|
|
(1, 10.98),
|
|
(1, 11.24),
|
|
(2, 4.23),
|
|
(1, 10.86),
|
|
(1, 10.46),
|
|
]
|
|
points_downlink = [
|
|
(1, 50.42),
|
|
(2, 15.3),
|
|
(1, 39.44),
|
|
(2, 25.47),
|
|
(1, 50.34),
|
|
(1, 49.34),
|
|
(1, 50.49),
|
|
(1, 52.16),
|
|
(2, 12.27),
|
|
(1, 50.69),
|
|
(1, 53.43),
|
|
]
|
|
points_rtt = [
|
|
(1, 14),
|
|
(2, 145),
|
|
(1, 15),
|
|
(2, 127),
|
|
(1, 15),
|
|
(1, 14),
|
|
(1, 19),
|
|
(1, 12),
|
|
(2, 108),
|
|
(1, 13),
|
|
(1, 13),
|
|
]
|
|
|
|
# Plotting points on Uplink Boxplot
|
|
for x, y in points_uplink:
|
|
axes[0].scatter(jitter(x), y, marker='x', color=cmap(14), linewidth=0.5)
|
|
|
|
# Plotting points on Downlink Boxplot
|
|
for x, y in points_downlink:
|
|
axes[1].scatter(jitter(x), y, marker='x', color=cmap(14), linewidth=0.5)
|
|
|
|
# Plotting points on RTT Boxplot
|
|
for x, y in points_rtt:
|
|
axes[2].scatter(jitter(x), y, marker='x', color=cmap(14), linewidth=0.5)
|
|
|
|
# Plot a dummy point for the legend (outside the visible range)
|
|
#axes[0].scatter([-100], [-100], marker='x', color=cmap(14), linewidth=0.5, label='synchronization failure')
|
|
#fig.legend(loc='upper center', bbox_to_anchor=(0.5, 1.1))
|
|
|
|
if save:
|
|
plt.savefig(
|
|
"chart-connection-boxplot.png",
|
|
dpi=900,
|
|
bbox_inches="tight",
|
|
transparent=True
|
|
)
|
|
|
|
if show:
|
|
plt.show()
|
|
|
|
|
|
def main():
|
|
#generate_measurement_stats_pie_chart(False, True)
|
|
#generate_measurement_repeats_histogram(False, True)
|
|
generate_connection_boxplots(False, True)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|