from pathlib import Path import matplotlib.pyplot as plt import numpy as np if __name__ == "__main__": # Path to your .npy file with anomaly scores scores_path = Path( "/home/fedex/mt/projects/thesis-kowalczyk-jan/Deep-SAD-PyTorch/infer/" "DeepSAD/subter_test/inference/3_smoke_human_walking_2023-01-23.npy" ) # Frames per second fps = 10 # Load all scores all_scores = np.load(scores_path) # (Optional) If your scores are a 1D array, remove or adjust this reshape # The final shape is expected to be (1, total_frames) or (N,) if you want only one line. all_scores = all_scores.reshape(1, -1) # shape becomes (1, total_frames) # We only want frames [0..299] => 300 frames max_frames = 300 scores = all_scores[0, :max_frames] # Take the first row's first 300 frames # Convert frames to time in seconds: time[i] = i / fps time_values = np.arange(len(scores)) / fps # shape is (max_frames,) # Recalculate y-limit based on the selected slice y_limit = 1.1 * np.max(scores[np.isfinite(scores)]) # If you want to ensure y_limit >= 10, uncomment below: # y_limit = max(y_limit, 10) print("Selected Scores Shape:", scores.shape) print("Time Range:", time_values[0], "->", time_values[-1]) print("Y-limit:", y_limit) # -------------------------- # Improve default font sizes # -------------------------- plt.rcParams.update( { "figure.dpi": 150, "font.size": 14, "axes.labelsize": 16, "axes.titlesize": 16, "xtick.labelsize": 14, "ytick.labelsize": 14, "legend.fontsize": 14, } ) # -------------------------------------------------- # Create the figure (half the previous width = 3.84) # -------------------------------------------------- fig, ax = plt.subplots(figsize=(3.84, 7)) # Plot the scores vs. time ax.plot(time_values, scores, label="Anomaly Score", color="blue") # Set axis labels ax.set_xlabel("Time [s]", fontsize=16) ax.set_ylabel("Score", fontsize=16) # Restrict X-axis from 0 to last time value (or 30 s if exactly 300 frames) ax.set_xlim([0, time_values[-1]]) ax.set_ylim([0, y_limit]) # ------------------------- # Customize the ticks # ------------------------- # Example: only 4 ticks on the x-axis (0, 10, 20, 30) if 300 frames => 30 s ax.set_xticks([0, 10, 20, 30]) # Guarantee at least one tick at y=10. # Adjust other ticks as you like; here we use 0 and the y_limit. # If y_limit <= 10, you might want to override it. if y_limit > 10: ax.set_yticks([0, 10, round(y_limit, 1)]) # round for cleaner display else: # If your data doesn't go that high, just keep 0 and y_limit ax.set_yticks([0, round(y_limit, 1)]) # Optionally add a legend ax.legend(loc="upper right") plt.axvline(x=22, color="r", label="shown image") # Tight layout for small figure plt.tight_layout() # ---------------------- # Save to disk, no show # ---------------------- output_filename = f"{scores_path.stem}_static_time_plot.png" plt.savefig(output_filename, dpi=150) # Clear the figure if you continue using matplotlib plt.clf()