add_noise_figures.py 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. import pandas as pd
  2. import seaborn as sns
  3. import matplotlib.pyplot as plt
  4. from scipy.stats import ttest_ind
  5. import os
  6. # Setting font and font size
  7. plt.rcParams['font.family'] = 'Times New Roman'
  8. plt.rcParams['font.size'] = 8
  9. # Load CSV file into a DataFrame
  10. script_dir = os.path.dirname(__file__)
  11. dirpath = os.path.dirname(script_dir)
  12. out_path = os.path.join(dirpath, 'figures')
  13. #os.mkdir(out_path)
  14. file_address = os.path.join(dirpath, "input", "noise_and_motion", "caculated_features_anat.csv")
  15. # Load CSV file into a DataFrame
  16. df = pd.read_csv(file_address)
  17. outdir = os.path.join(dirpath, "figures")
  18. # Filter data into four groups based on the presence of "speckleNoisy.nii.gz", "saltPepperNoisy.nii.gz", "randomNoisy.nii.gz", and "original.nii.gz" in the FileAddress column
  19. group_with_speckle_noise = df[df['FileAddress'].str.contains('speckleNoisy.nii.gz', na=False)]
  20. group_with_salt_pepper_noise = df[df['FileAddress'].str.contains('saltPepperNoisy.nii.gz', na=False)]
  21. group_with_random_noise = df[df['FileAddress'].str.contains('randomNoisy.nii.gz', na=False)]
  22. group_with_original = df[~df['FileAddress'].str.contains('ois', na=False)]
  23. # Extract SNR values for each group
  24. snr_chang_with_speckle_noise = group_with_speckle_noise['SNR Chang']
  25. snr_chang_with_salt_pepper_noise = group_with_salt_pepper_noise['SNR Chang']
  26. snr_chang_with_random_noise = group_with_random_noise['SNR Chang']
  27. snr_chang_with_original = group_with_original['SNR Chang']
  28. snr_normal_with_speckle_noise = group_with_speckle_noise['SNR Normal']
  29. snr_normal_with_salt_pepper_noise = group_with_salt_pepper_noise['SNR Normal']
  30. snr_normal_with_random_noise = group_with_random_noise['SNR Normal']
  31. snr_normal_with_original = group_with_original['SNR Normal']
  32. cm = 1/2.53
  33. # Create boxplot for Displacement factor
  34. plt.figure(figsize=(12 * cm, 5 * cm), dpi=300) # Adjust the figure size as needed
  35. plt.subplot(1, 2, 1)
  36. sns.boxplot(data=[snr_chang_with_random_noise,
  37. snr_chang_with_salt_pepper_noise,
  38. snr_chang_with_speckle_noise, snr_chang_with_original], palette="Set2", fliersize=3,
  39. flierprops={"marker": "o"},width=0.6, boxprops={'zorder': 3}, linewidth=1,showfliers=False,)
  40. plt.title('(a)', fontsize=10, fontweight='bold', loc="left")
  41. plt.xticks(ticks=[0, 1, 2, 3], labels=['Gaussian ', 'S&P', 'Speckle', 'Original'])
  42. plt.xlabel('Noise type', fontsize=8, fontname='Times New Roman')
  43. plt.ylabel('SNR Chang (dB)', fontsize=8, fontname='Times New Roman')
  44. plt.ylim([18,57])
  45. plt.subplot(1, 2, 2)
  46. sns.boxplot(data=[snr_normal_with_random_noise,
  47. snr_normal_with_salt_pepper_noise,
  48. snr_normal_with_speckle_noise,
  49. snr_normal_with_original], palette="Set2", fliersize=3,
  50. flierprops={"marker": "o"}, saturation=1, showfliers=False,
  51. width=0.6, boxprops={'zorder': 3}, linewidth=1)
  52. plt.title('(b)', fontsize=10, fontweight='bold', loc="left")
  53. plt.xticks(ticks=[0, 1, 2, 3], labels=['Gaussian ', 'S&P', 'Speckle', 'Original'])
  54. plt.xlabel('Noise type', fontsize=8, fontname='Times New Roman')
  55. plt.ylabel('SNR Standard (dB)', fontsize=8, fontname='Times New Roman')
  56. plt.ylim([10,42])
  57. # Remove rows with NaN values from SNR Chang datasets
  58. snr_chang_with_speckle_noise = snr_chang_with_speckle_noise.dropna()
  59. snr_chang_with_salt_pepper_noise = snr_chang_with_salt_pepper_noise.dropna()
  60. snr_chang_with_random_noise = snr_chang_with_random_noise.dropna()
  61. # Perform Welch's t-tests for SNR Chang between Original and each noise type
  62. ttest_welch_chang_original_vs_salt_pepper = ttest_ind(snr_chang_with_original, snr_chang_with_salt_pepper_noise, equal_var=False)
  63. ttest_welch_chang_original_vs_speckle = ttest_ind(snr_chang_with_original, snr_chang_with_speckle_noise, equal_var=False)
  64. ttest_welch_chang_original_vs_random = ttest_ind(snr_chang_with_original, snr_chang_with_random_noise, equal_var=False)
  65. # Perform Welch's t-tests for SNR Normal between Original and each noise type
  66. ttest_welch_normal_original_vs_salt_pepper = ttest_ind(snr_normal_with_original, snr_normal_with_salt_pepper_noise, equal_var=False)
  67. ttest_welch_normal_original_vs_speckle = ttest_ind(snr_normal_with_original, snr_normal_with_speckle_noise, equal_var=False)
  68. ttest_welch_normal_original_vs_random = ttest_ind(snr_normal_with_original, snr_normal_with_random_noise, equal_var=False)
  69. # Adjust p-values for multiple comparisons using Bonferroni correction
  70. alpha = 0.05
  71. num_comparisons = 3 # Number of comparisons
  72. alpha_adjusted = alpha / num_comparisons
  73. p_values_chang = [ttest_welch_chang_original_vs_salt_pepper.pvalue, ttest_welch_chang_original_vs_speckle.pvalue, ttest_welch_chang_original_vs_random.pvalue]
  74. reject_null_chang = [p < alpha_adjusted for p in p_values_chang]
  75. p_values_normal = [ttest_welch_normal_original_vs_salt_pepper.pvalue, ttest_welch_normal_original_vs_speckle.pvalue, ttest_welch_normal_original_vs_random.pvalue]
  76. reject_null_normal = [p < alpha_adjusted for p in p_values_normal]
  77. # Print adjusted p-values
  78. print("Adjusted p-values for SNR Chang:")
  79. print("Original vs Salt & Pepper:", ttest_welch_chang_original_vs_salt_pepper.pvalue, "Reject Null:", reject_null_chang[0])
  80. print("Original vs Speckle:", ttest_welch_chang_original_vs_speckle.pvalue, "Reject Null:", reject_null_chang[1])
  81. print("Original vs Random:", ttest_welch_chang_original_vs_random.pvalue, "Reject Null:", reject_null_chang[2])
  82. print("\nAdjusted p-values for SNR Normal:")
  83. print("Original vs Salt & Pepper:", ttest_welch_normal_original_vs_salt_pepper.pvalue, "Reject Null:", reject_null_normal[0])
  84. print("Original vs Speckle:", ttest_welch_normal_original_vs_speckle.pvalue, "Reject Null:", reject_null_normal[1])
  85. print("Original vs Random:", ttest_welch_normal_original_vs_random.pvalue, "Reject Null:", reject_null_normal[2])
  86. # Adjust layout
  87. plt.tight_layout()
  88. # Save the plot as SVG
  89. plt.savefig(os.path.join(outdir, "NoiseComparisons.svg"), format='svg', dpi=300)
  90. plt.show()