|
|
@@ -0,0 +1,101 @@
|
|
|
+import pandas as pd
|
|
|
+import matplotlib.pyplot as plt
|
|
|
+import numpy as np
|
|
|
+
|
|
|
+#======================================================
|
|
|
+# == SCRIPT PARAMETERS ==
|
|
|
+#======================================================
|
|
|
+
|
|
|
+# === CSV Parameters ===
|
|
|
+CSV_FILENAME = r"c:\Users\ranny\Downloads\week_2025_41_data.csv"
|
|
|
+CSV_SEPARATOR = ","
|
|
|
+
|
|
|
+COL_DIAMETER = "Diameter1 [mm]"
|
|
|
+COL_VELOCITY = "Velocity [m/s]"
|
|
|
+COL_TEMPERATURE = "Temperature [C]"
|
|
|
+COL_TEMP_GROUPED = "TempGrouped" # column added by script
|
|
|
+
|
|
|
+# === Limits for Velocity & Diameter Filtering ===
|
|
|
+LIM_VELOCITY_MIN = 0.2 # m/s
|
|
|
+LIM_DIAMETER_MIN = 0.7 # mm
|
|
|
+LIM_DIAMETER_MAX = 5.0 # mm
|
|
|
+
|
|
|
+# === Data Analysis Parameters ===
|
|
|
+TEMP_BIN_SIZE = 2 # split by 2 degrees
|
|
|
+FIT_SAMPLE_COUNT = 100
|
|
|
+
|
|
|
+# === Figure Parameters ===
|
|
|
+FIG_WIDTH = 9
|
|
|
+FIG_HEIGHT = 6
|
|
|
+
|
|
|
+FIG_DATA_ALPHA = 0.6
|
|
|
+FIG_DATA_SIZE = 35
|
|
|
+
|
|
|
+FIG_TR_COLOR = "black" # trendline color
|
|
|
+FIG_TR_SIZE = 2
|
|
|
+
|
|
|
+FIG_LEGEND_TITLE = "Teplotné Skupiny [°C]"
|
|
|
+FIG_LEGEND_SIZE = 8
|
|
|
+FIG_LEGEND_COLS = 2
|
|
|
+
|
|
|
+FIG_TITLE = f"Závislosť Rýchlosť a Priemeru Častíc Zoskupené po {TEMP_BIN_SIZE}°C Teplotných Skupinách"
|
|
|
+FIG_X_LABEL = "Priemer Častice [mm]"
|
|
|
+FIG_Y_LABEL = "Rýchlosť Častice [m/s]"
|
|
|
+
|
|
|
+FIG_GRID_STYLE = ":"
|
|
|
+
|
|
|
+#======================================================
|
|
|
+# == SCRIPT COMMANDS ==
|
|
|
+#======================================================
|
|
|
+
|
|
|
+# === Load CSV ===
|
|
|
+df = pd.read_csv(CSV_FILENAME, sep=CSV_SEPARATOR)
|
|
|
+
|
|
|
+# === Clean column names ===
|
|
|
+df.columns = [col.strip() for col in df.columns]
|
|
|
+
|
|
|
+# === Drop missing data & provide filtering ===
|
|
|
+df = df.dropna(subset=[COL_DIAMETER, COL_VELOCITY, COL_TEMPERATURE])
|
|
|
+df = df[df[COL_VELOCITY] >= LIM_VELOCITY_MIN]
|
|
|
+df = df[(df[COL_DIAMETER] >= LIM_DIAMETER_MIN) & (df[COL_DIAMETER] <= LIM_DIAMETER_MAX)]
|
|
|
+
|
|
|
+# === Group temperatures by 2°C bins ===
|
|
|
+df[COL_TEMP_GROUPED] = (df[COL_TEMPERATURE] // TEMP_BIN_SIZE * TEMP_BIN_SIZE).astype(int)
|
|
|
+
|
|
|
+# Find most frequent temperature group
|
|
|
+most_common_temp = df[COL_TEMP_GROUPED].value_counts().idxmax()
|
|
|
+count = df[COL_TEMP_GROUPED].value_counts().max()
|
|
|
+print(f"The most frequent temperature group is {most_common_temp}–{most_common_temp+1}°C with {count} samples.")
|
|
|
+
|
|
|
+# === Prepare plot ===
|
|
|
+plt.figure(figsize=(FIG_WIDTH, FIG_HEIGHT))
|
|
|
+unique_temps = sorted(df[COL_TEMP_GROUPED].unique())
|
|
|
+colors = plt.cm.plasma(np.linspace(0, 1, len(unique_temps)))
|
|
|
+
|
|
|
+# === Scatter + power fit for each temperature group ===
|
|
|
+trendline_handle = None
|
|
|
+for color, temp in zip(colors, unique_temps):
|
|
|
+ group = df[df[COL_TEMP_GROUPED] == temp]
|
|
|
+ plt.scatter(group[COL_DIAMETER], group[COL_VELOCITY],
|
|
|
+ color=color, label=f"{temp}-{temp+1} °C", alpha=FIG_DATA_ALPHA, s=FIG_DATA_SIZE)
|
|
|
+
|
|
|
+ # Power-law fit only for the most frequent group
|
|
|
+ if temp == most_common_temp and len(group) >= 2:
|
|
|
+ x = group[COL_DIAMETER].values
|
|
|
+ y = group[COL_VELOCITY].values
|
|
|
+ coeffs = np.polyfit(np.log(x), np.log(y), 1)
|
|
|
+ b = coeffs[0]
|
|
|
+ a = np.exp(coeffs[1])
|
|
|
+ xfit = np.linspace(x.min(), x.max(), FIT_SAMPLE_COUNT)
|
|
|
+ yfit = a * xfit ** b
|
|
|
+ trendline_handle, = plt.plot(xfit, yfit, color=FIG_TR_COLOR, linewidth=FIG_TR_SIZE,
|
|
|
+ label=f"Mocninová Aproximácia {temp}-{temp+1} °C")
|
|
|
+ print(f"Power fit @ {temp}-{temp+1}°C: v = {a:.4e} * d^{b:.4f}")
|
|
|
+
|
|
|
+plt.title(FIG_TITLE)
|
|
|
+plt.xlabel(FIG_X_LABEL)
|
|
|
+plt.ylabel(FIG_Y_LABEL)
|
|
|
+plt.legend(title=FIG_LEGEND_TITLE, fontsize=FIG_LEGEND_SIZE, ncol=FIG_LEGEND_COLS)
|
|
|
+plt.grid(True, linestyle=FIG_GRID_STYLE)
|
|
|
+plt.tight_layout()
|
|
|
+plt.show()
|