Вот предложение о том, как визуализировать относительные положения ваших точек. Я бы хотел, чтобы для каждой временной метки был построен эллипс в позиции (X_, Y_)
, где:
X_
- это среднее значение ваших координат X для этой временной метки. Y_
- это среднее значение ваших координат X для этой отметки времени. - ширина эллипса равна дисперсии координат вашей точки X для этой отметки времени.
- высота эллипса равна дисперсии координат ваших точек Y для этой отметки времени.
Таким образом, одним взглядом и для каждой временной отметки вы можете прочитать статистику очень высокого уровня о вашем распределении координат в этой временной отметке.
Вот некоторый код для генерации такой визуализация:
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.patches import Ellipse
# sample data with 4 timestamps
df = pd.DataFrame({
'Time' : [1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4],
'id' : ['A','B','C','D','A','B','C','D','A','B','C','D','A','B','C','D'],
'X' : [1,2,1,2,1,2,1,2,4,4,3,4,10,8,5,6],
'Y' : [1,1,3,3,1,1,2,2,5,5,8,5,6,6,7,6],
})
# for each timestamp, compute means and variances within all samples for that timestamp
means = df.groupby("Time")[["X", "Y"]].mean()
variances = df.groupby("Time")[["X", "Y"]].var()
df_ = pd.concat([means, variances], axis=1)
df_.columns = ["X_", "Y_", "var_X", "var_Y"]
# plot
fig, ax = plt.subplots(subplot_kw={'aspect': 'equal'})
for row in df_.itertuples():
ellipse = Ellipse(xy=(row.X_, row.Y_), # position of the ellipse is (X,Y)
width=row.var_X, # width helps to get a grasp on X variance
height=row.var_Y, # height helps to get a grasp on Y variance
angle=0)
ax.add_artist(ellipse)
ellipse.set_clip_box(ax.bbox)
ellipse.set_alpha(.4)
plt.text(x=row.X_+0.2, y=row.Y_+0.2, s=f"t={row.Index}") # just add timestamp legend
ax.set_xlim(0, 10)
ax.set_ylim(0, 10)
plt.show()
Что бы выглядело так:
Что вы думаете? Другая идея может состоять в том, чтобы сделать GIF (в случае, если среднее значение временных меток слишком сильно сталкивается).