Heatmap_3D_Multiple.py 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. import UnityEngine as ue
  2. import pandas as pd
  3. import numpy as np
  4. import matplotlib.pyplot as plt
  5. import matplotlib.cm as cm
  6. import json
  7. from matplotlib.colors import LinearSegmentedColormap
  8. from mpl_toolkits.mplot3d import Axes3D
  9. WIDTH = int(70)
  10. HEIGHT = int(35)
  11. INDEX1 = "1"
  12. INDEX2 = "2"
  13. INDEX3 = "3"
  14. COND = "17"
  15. POSITION_PATH1 = ue.Application.dataPath + '/Data_position/'+ COND +'/Walk'+ INDEX1 +'.csv'
  16. POSITION_PATH2 = ue.Application.dataPath + '/Data_position/'+ COND +'/Walk'+ INDEX2 +'.csv'
  17. POSITION_PATH3 = ue.Application.dataPath + '/Data_position/'+ COND +'/Walk'+ INDEX3 +'.csv'
  18. HEATMAP_PATH = 'Assets/Data_image/'+ COND +'/heatmap3DMultiple.png'
  19. SAVEFILE = 'Assets/Resources/Json/'+ COND +'/heatmap3DMultiple.json'
  20. def get_data_hight(path):
  21. dataset = pd.read_csv(path, sep=';', usecols=["Delta Time", "Position x", "Position z"], decimal=',', dtype={'Delta Time': float, 'Position x': float, 'Position z': float})
  22. dataset["Position x"] = dataset["Position x"].round(0)
  23. dataset["Position z"] = dataset["Position z"].round(0)
  24. dataset["Delta Time"] = dataset["Delta Time"].round(2)
  25. dataset_human_on_same_spot = dataset.groupby(["Delta Time", "Position x", "Position z"]).size().reset_index(name='AmountOneSpot')
  26. dataset_human_amount_per_deltaTime = dataset_human_on_same_spot.groupby(['Delta Time']).size().reset_index(name='counts')
  27. solution = np.zeros((HEIGHT, WIDTH))
  28. old = np.zeros((HEIGHT, WIDTH))
  29. current = np.zeros((HEIGHT, WIDTH))
  30. minStart = 0
  31. for i in range(dataset_human_amount_per_deltaTime.shape[0]):
  32. for count in range(minStart, minStart + int(dataset_human_amount_per_deltaTime['counts'][i])):
  33. x = int(dataset_human_on_same_spot['Position x'][count])
  34. y = int(dataset_human_on_same_spot['Position z'][count])
  35. if i == 0:
  36. old[y][x] = dataset_human_on_same_spot['AmountOneSpot'][count]
  37. else :
  38. current[y][x] = dataset_human_on_same_spot['AmountOneSpot'][count]
  39. if i > 0:
  40. solution = solution + np.absolute(old - current)
  41. old = current
  42. current = np.zeros((HEIGHT, WIDTH))
  43. minStart += int(dataset_human_amount_per_deltaTime['counts'][i])
  44. return solution
  45. # 1. Get position data from csv file
  46. data1 = pd.read_csv(POSITION_PATH1, sep=';', usecols=["Position x", "Position z"], decimal=',', dtype={'Position x': float, 'Position z': float})
  47. data1 = data1.round(0)
  48. data2 = pd.read_csv(POSITION_PATH2, sep=';', usecols=["Position x", "Position z"], decimal=',', dtype={'Position x': float, 'Position z': float})
  49. data2 = data2.round(0)
  50. data3 = pd.read_csv(POSITION_PATH3, sep=';', usecols=["Position x", "Position z"], decimal=',', dtype={'Position x': float, 'Position z': float})
  51. data3 = data3.round(0)
  52. # 2. Group by positions and count appearance
  53. data_count1 = data1.groupby(['Position x', 'Position z']).size().reset_index(name='counts')
  54. data_count2 = data2.groupby(['Position x', 'Position z']).size().reset_index(name='counts')
  55. data_count3 = data3.groupby(['Position x', 'Position z']).size().reset_index(name='counts')
  56. # 3.1 Assign x, y, z, width, depth, height
  57. x1 = data_count1["Position x"].tolist()
  58. y1 = data_count1["Position z"].tolist()
  59. z1 = np.zeros_like(len(x1))
  60. # dz1 = data_count1["counts"].tolist() # Change
  61. x2 = data_count2["Position x"].tolist()
  62. y2 = data_count2["Position z"].tolist()
  63. z2 = np.zeros_like(len(x2))
  64. # dz2 = data_count2["counts"].tolist() # Change
  65. x3 = data_count3["Position x"].tolist()
  66. y3 = data_count3["Position z"].tolist()
  67. z3 = np.zeros_like(len(x3))
  68. # dz3 = data_count3["counts"].tolist() # Change
  69. # 3.2 Assign height of the bars
  70. dz_dynamic1 = get_data_hight(POSITION_PATH1)
  71. dz1 = []
  72. for i in range(len(x1)):
  73. dz1.append(dz_dynamic1[int(y1[i])][int(x1[i])])
  74. dz_dynamic2 = get_data_hight(POSITION_PATH2)
  75. dz2 = []
  76. for i in range(len(x2)):
  77. dz2.append(dz_dynamic2[int(y2[i])][int(x2[i])])
  78. dz_dynamic3 = get_data_hight(POSITION_PATH3)
  79. dz3 = []
  80. for i in range(len(x3)):
  81. dz3.append(dz_dynamic3[int(y3[i])][int(x3[i])])
  82. # 3.3 Add offset to day2 and day3
  83. x2[:] = [a+0.5 for a in x2[:]]
  84. x3[:] = [a+0.5 for a in x3[:]]
  85. y3[:] = [a+0.5 for a in y3[:]]
  86. # 4. Create figure and axes
  87. fig = plt.figure()
  88. ax = fig.add_subplot(111, projection='3d')
  89. # 5.1 Create custom colormap Day1, Day2, Day3
  90. cmap1 = LinearSegmentedColormap.from_list(name='day1', colors=[(0.40,0.76,0.65), (0.11,0.62,0.47)])
  91. cmap2 = LinearSegmentedColormap.from_list(name='day2', colors=[(0.99,0.55,0.38), (0.85,0.37,0.01)])
  92. cmap3 = LinearSegmentedColormap.from_list(name='day3', colors=[(0.55,0.63,0.80), (0.46,0.44,0.70)])
  93. # 5.2 Initialize array for coloring the bars
  94. dz_array1 = np.array(data_count1['counts'])
  95. fracs1 = dz_array1.astype(float) / dz_array1.max()
  96. color_values1 = cmap1(fracs1.tolist())
  97. dz_array2 = np.array(data_count2['counts'])
  98. fracs2 = dz_array2.astype(float) / dz_array2.max()
  99. color_values2 = cmap2(fracs2.tolist())
  100. dz_array3 = np.array(data_count3['counts'])
  101. fracs3 = dz_array3.astype(float) / dz_array3.max()
  102. color_values3 = cmap3(fracs3.tolist())
  103. # 5.3 calculate alpha value of the bars
  104. alpha_values1 = np.array(data_count1['counts'])
  105. alpha_values1 = alpha_values1.astype(np.float)
  106. alpha_values1 = (alpha_values1 - alpha_values1.min()) / (alpha_values1.max() - alpha_values1.min())
  107. alpha_values2 = np.array(data_count2['counts'])
  108. alpha_values2 = alpha_values2.astype(np.float)
  109. alpha_values2 = (alpha_values2 - alpha_values2.min()) / (alpha_values2.max() - alpha_values2.min())
  110. alpha_values3 = np.array(data_count3['counts'])
  111. alpha_values3 = alpha_values3.astype(np.float)
  112. alpha_values3 = (alpha_values3 - alpha_values3.min()) / (alpha_values3.max() - alpha_values3.min())
  113. # 6. Create the bars
  114. img = ax.bar3d(x1, y1, z1, 0.5, 0.5, dz1, color=color_values1, shade=False)
  115. img = ax.bar3d(x2, y2, z2, 0.5, 0.5, dz2, color=color_values2, shade=False)
  116. img = ax.bar3d(x3, y3, z3, 0.5, 0.5, dz3, color=color_values3, shade=False)
  117. # 7. Create Colorbar
  118. color_intense1 = data_count1['counts'].tolist()
  119. color_map1 = cm.ScalarMappable(cmap=cmap1)
  120. color_map1.set_array(color_intense1)
  121. fig.colorbar(color_map1)
  122. color_intense2 = data_count2['counts'].tolist()
  123. color_map2 = cm.ScalarMappable(cmap=cmap2)
  124. color_map2.set_array(color_intense2)
  125. fig.colorbar(color_map2)
  126. color_intense3 = data_count3['counts'].tolist()
  127. color_map3 = cm.ScalarMappable(cmap=cmap3)
  128. color_map3.set_array(color_intense3)
  129. fig.colorbar(color_map3)
  130. # 8.
  131. ax.set_xlabel('Width')
  132. ax.set_ylabel('Height')
  133. ax.set_zlabel('Human dynamic')
  134. plt.show()
  135. # 10. Save 3D Heatmap
  136. # heatmap.get_figure().savefig(HEATMAP_PATH, transparent=True)
  137. # fig.savefig(HEATMAP_PATH, transparent=True)
  138. # 11. Save the data from the Heatmap to create it in Unity
  139. dz1 = (np.array(dz1)/np.array(dz1).max()).tolist()
  140. dz2 = (np.array(dz2)/np.array(dz2).max()).tolist()
  141. dz3 = (np.array(dz3)/np.array(dz3).max()).tolist()
  142. jsonData = {"x1" : x1,
  143. "y1" : y1,
  144. "z1" : z1.tolist(),
  145. "dz1" : dz1,
  146. "alpha_values1" : alpha_values1.flatten().tolist(),
  147. "x2" : x2,
  148. "y2" : y2,
  149. "z2" : z2.tolist(),
  150. "dz2" : dz2,
  151. "alpha_values2" : alpha_values2.flatten().tolist(),
  152. "x3" : x3,
  153. "y3" : y3,
  154. "z3" : z3.tolist(),
  155. "dz3" : dz3,
  156. "alpha_values3" : alpha_values3.flatten().tolist()}
  157. with open(SAVEFILE, 'w') as filehandle:
  158. json.dump(jsonData, filehandle)