Heatmap_3D_Multiple.py 5.7 KB

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