velocity_vs_diameter.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. import pandas as pd
  2. import matplotlib.pyplot as plt
  3. import numpy as np
  4. #======================================================
  5. # == SCRIPT PARAMETERS ==
  6. #======================================================
  7. # === CSV Parameters ===
  8. CSV_FILENAME = r"c:\Users\ranny\Downloads\week_2025_41_data.csv"
  9. CSV_SEPARATOR = ","
  10. COL_DIAMETER = "Diameter1 [mm]"
  11. COL_VELOCITY = "Velocity [m/s]"
  12. COL_TEMPERATURE = "Temperature [C]"
  13. COL_TEMP_GROUPED = "TempGrouped" # column added by script
  14. # === Limits for Velocity & Diameter Filtering ===
  15. LIM_VELOCITY_MIN = 0.2 # m/s
  16. LIM_DIAMETER_MIN = 0.7 # mm
  17. LIM_DIAMETER_MAX = 5.0 # mm
  18. # === Data Analysis Parameters ===
  19. TEMP_BIN_SIZE = 2 # split by 2 degrees
  20. FIT_SAMPLE_COUNT = 100
  21. # === Figure Parameters ===
  22. FIG_WIDTH = 9
  23. FIG_HEIGHT = 6
  24. FIG_DATA_ALPHA = 0.6
  25. FIG_DATA_SIZE = 35
  26. FIG_TR_COLOR = "black" # trendline color
  27. FIG_TR_SIZE = 2
  28. FIG_LEGEND_TITLE = "Teplotné Skupiny [°C]"
  29. FIG_LEGEND_SIZE = 8
  30. FIG_LEGEND_COLS = 2
  31. FIG_TITLE = f"Závislosť Rýchlosť a Priemeru Častíc Zoskupené po {TEMP_BIN_SIZE}°C Teplotných Skupinách"
  32. FIG_X_LABEL = "Priemer Častice [mm]"
  33. FIG_Y_LABEL = "Rýchlosť Častice [m/s]"
  34. FIG_GRID_STYLE = ":"
  35. #======================================================
  36. # == SCRIPT COMMANDS ==
  37. #======================================================
  38. # === Load CSV ===
  39. df = pd.read_csv(CSV_FILENAME, sep=CSV_SEPARATOR)
  40. # === Clean column names ===
  41. df.columns = [col.strip() for col in df.columns]
  42. # === Drop missing data & provide filtering ===
  43. df = df.dropna(subset=[COL_DIAMETER, COL_VELOCITY, COL_TEMPERATURE])
  44. df = df[df[COL_VELOCITY] >= LIM_VELOCITY_MIN]
  45. df = df[(df[COL_DIAMETER] >= LIM_DIAMETER_MIN) & (df[COL_DIAMETER] <= LIM_DIAMETER_MAX)]
  46. # === Group temperatures by 2°C bins ===
  47. df[COL_TEMP_GROUPED] = (df[COL_TEMPERATURE] // TEMP_BIN_SIZE * TEMP_BIN_SIZE).astype(int)
  48. # Find most frequent temperature group
  49. most_common_temp = df[COL_TEMP_GROUPED].value_counts().idxmax()
  50. count = df[COL_TEMP_GROUPED].value_counts().max()
  51. print(f"The most frequent temperature group is {most_common_temp}–{most_common_temp+1}°C with {count} samples.")
  52. # === Prepare plot ===
  53. plt.figure(figsize=(FIG_WIDTH, FIG_HEIGHT))
  54. unique_temps = sorted(df[COL_TEMP_GROUPED].unique())
  55. colors = plt.cm.plasma(np.linspace(0, 1, len(unique_temps)))
  56. # === Scatter + power fit for each temperature group ===
  57. trendline_handle = None
  58. for color, temp in zip(colors, unique_temps):
  59. group = df[df[COL_TEMP_GROUPED] == temp]
  60. plt.scatter(group[COL_DIAMETER], group[COL_VELOCITY],
  61. color=color, label=f"{temp}-{temp+1} °C", alpha=FIG_DATA_ALPHA, s=FIG_DATA_SIZE)
  62. # Power-law fit only for the most frequent group
  63. if temp == most_common_temp and len(group) >= 2:
  64. x = group[COL_DIAMETER].values
  65. y = group[COL_VELOCITY].values
  66. coeffs = np.polyfit(np.log(x), np.log(y), 1)
  67. b = coeffs[0]
  68. a = np.exp(coeffs[1])
  69. xfit = np.linspace(x.min(), x.max(), FIT_SAMPLE_COUNT)
  70. yfit = a * xfit ** b
  71. trendline_handle, = plt.plot(xfit, yfit, color=FIG_TR_COLOR, linewidth=FIG_TR_SIZE,
  72. label=f"Mocninová Aproximácia {temp}-{temp+1} °C")
  73. print(f"Power fit @ {temp}-{temp+1}°C: v = {a:.4e} * d^{b:.4f}")
  74. plt.title(FIG_TITLE)
  75. plt.xlabel(FIG_X_LABEL)
  76. plt.ylabel(FIG_Y_LABEL)
  77. plt.legend(title=FIG_LEGEND_TITLE, fontsize=FIG_LEGEND_SIZE, ncol=FIG_LEGEND_COLS)
  78. plt.grid(True, linestyle=FIG_GRID_STYLE)
  79. plt.tight_layout()
  80. plt.show()