Как правильно сравнить данные из двух CSV файлов? Отрисовка точек попадающих между графиками
Смысл в чём - есть два .csv файла с данными, один на 600 строк, второй на ~2500. В каждом одинаковые значения столбцов. Столбцов 6, нужны какие-то два из них, для примера возьмём time и r.
В Matplotlib по данным из первого файла отрисовывается какой-то график. Потом, по этим двум полям отрисовываются две границы (значение поля time и значение r +- 200, как вариант). Дальше, из второго файла мне нужно отрисовать точки (scatter) по этим же полям, но так, чтобы при попадании в вычисленные границы (или проще говоря между графиками 1 и 2) они отрисовывались одним цветом, а при вылезании за границы, цвет был другой.
Как правильно сравнивать точку из одного файла, с точкой из другого?
Я пробовала организовать это через if...else, но поскольку массивы разного размера, вылезает ошибка:
ValueError: Series lengths must match to compare.
Ошибочный код такой:
if (mixed_r > threshold_down_0_r) and (mixed_r < threshold_up_0_r):
ax1.scatter(mixed_time, mixed_r, marker='x', color='b')
else:
ax1.scatter(mixed_time, mixed_r, marker='x', color='y')
Значения берутся с помощью pandas:
mixed = pd.read_csv("mixed.csv")
mixed_time = mixed['time']
mixed_r = mixed['r']
Мне нужно, чтобы те точки, которые попадают в "границы" одного из графиков, окрашивались в его цвет. Сейчас все точки отрисованы синим.
Код построения графика, примерно, такой:
# данные траекторий
trajectory0 = pd.read_csv("trajectory0.csv")
trajectory0_time = trajectory0['time']
trajectory0_r = trajectory0['r']
ax1.plot(trajectory0_time, trajectory0_r, ".")
threshold_down_0_r = trajectory0['r'] - r_threshold/2
threshold_up_0_r = trajectory0['r'] + r_threshold/2
ax1.plot(trajectory0_time, threshold_down_0_r, c='b')
ax1.plot(trajectory0_time, threshold_up_0_r, c='b')
ax1.fill_between(trajectory0_time, threshold_up_0_r, threshold_down_0_r, alpha=0.2, color='b')
# дальше отрисовка точек-замеров (именно этот момент, я не знаю как правильно организовать)
ax1.scatter(mixed_time, mixed_r, marker='x')
Код для остальных графиков аналогичен.
Ответы (1 шт):
Я советую вам использовать возможности pandas. как именно вы будете разделять данные - дело ваше, я попытаюсь показать принцип. Раз исходных данных нет, то сделаем на примерных сетах
df1 = pd.DataFrame([x**2 for x in range(10)]) # примерный датафрейм с основным графиком
df1['threshold_up'] = df1[0] + 10 # вычисляем пороги и заносим эти значения в тот же df
df1['threshold_down'] = df1[0] - 10
# рисуем основной график и пороги
plt.plot(df1[0])
plt.fill_between(df1.index, df1['threshold_down'] ,df1['threshold_up'], alpha=0.2, color='b')
Получаем:
# создаем второй датафрейм с данными для точек
np.random.seed(12)
df2 = pd.DataFrame(np.random.choice(81, 10), index=df1.index, columns=['mixed'])
# принимая во внимание, что основной и доп. график разделяют общую ось абсцисс
# объединяем
df1 = df1.join(df2)
получается такой датафрейм:
0 threshold_up threshold_down mixed
0 0 10 -10 75
1 1 11 -9 27
2 4 14 -6 6
3 9 19 -1 2
4 16 26 6 3
5 25 35 15 67
6 36 46 26 76
7 49 59 39 48
8 64 74 54 22
9 81 91 71 49
Далее, делим его на части, которые попадают в границы порогов и которые не попадают:
special_dots = df1[(df1['threshold_down'].le(df1['mixed'])) & (df1['threshold_up'].ge(df1['mixed']))]
common_dots = pd.concat([df1, special_dots, special_dots]).drop_duplicates(keep=False)
# и отрисовываем:
plt.scatter(common_dots.index, common_dots['mixed'], color='g', marker='x')
plt.scatter(special_dots.index, special_dots['mixed'], color='b', marker='x')
plt.show()


