import sys import matplotlib.pyplot as plt import pandas as pd import scienceplots # noqa: F401 plt.style.use(["science"]) plt.rcParams.update({ "text.usetex": True, "font.family": "serif", "font.serif": ["Times"], }) # Get CSV filenames from command line arguments if len(sys.argv) < 2: print("Usage: python script.py [ ...]") sys.exit(1) csv_filenames = sys.argv[1:] # Output filename output_filename = "compute-impact.pdf" # Read data from all CSV files and concatenate dfs = [pd.read_csv(filename) for filename in csv_filenames] df = pd.concat(dfs, ignore_index=True) # Create figure and axis fig, ax = plt.subplots(figsize=(10, 6)) # Get unique systems and thread counts systems = df["system"].unique() thread_counts = sorted(df["threads"].unique()) # Get colors from the current color cycle prop_cycle = plt.rcParams["axes.prop_cycle"] colors_list = prop_cycle.by_key()["color"] # Plot a line for each system-thread combination markers = ["o", "s", "^", "D"] linestyles = ["-", "--", "-.", ":"] plot_idx = 0 for sys_idx, system in enumerate(systems): df_system = df[df["system"] == system] for thread_idx, threads in enumerate(thread_counts): df_thread = df_system[df_system["threads"] == threads].sort_values("compute") if len(df_thread) > 0: ax.plot(df_thread["compute"], df_thread["throughput"], marker=markers[thread_idx % len(markers)], color=colors_list[plot_idx % len(colors_list)], linestyle=linestyles[sys_idx % len(linestyles)], linewidth=2, markersize=8, label=f'{system} ({threads} thread{"s" if threads > 1 else ""})') plot_idx += 1 # Customize the plot ax.set_xlabel(r"Compute Time (microseconds)", fontsize=14, fontweight="bold") ax.set_ylabel("Throughput (rows/second)", fontsize=14, fontweight="bold") # Set y-axis to start from 0 with dynamic upper limit max_throughput = df["throughput"].max() ax.set_ylim(0, max_throughput * 1.15) # Add 15% tolerance for legend space # Format y-axis labels ax.yaxis.set_major_formatter(plt.FuncFormatter(lambda x, p: f"{int(x/1000)}k")) # Add legend ax.legend(loc="lower left", frameon=True, fontsize=11) # Add grid for better readability ax.grid(axis="both", alpha=0.3, linestyle="--") ax.set_axisbelow(True) # Adjust layout plt.tight_layout() # Save the figure plt.savefig(output_filename, dpi=300, bbox_inches="tight") print(f"Saved plot to {output_filename}") # Display the plot plt.show()