Heatmap_3D_Multiple.py 7.2 KB

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