Пересечение графика matplotlib с несортированными данными
При построении некоторых точек с matplotlib
я столкнулся с каким-то странным поведением при создании графика. Вот код для создания этого графика.
import matplotlib.pyplot as plt
desc_x =[4000,3000,2000,2500,2750,2250,2300,2400,2450,2350]
rmse_desc = [.31703 , .31701, .31707, .31700, .31713, .31698, .31697, .31688, .31697, .31699]
fig = plt.figure()
ax = plt.subplot(111)
fig.suptitle('title')
plt.xlabel('x')
plt.ylabel('y')
ax.plot(desc_x, rmse_desc, 'b', label='desc' )
ax.legend()
plt.show()
Вот график, который он создает
![graph with lines]()
Как вы можете сказать, этот график имеет пересекающиеся строки, чего не видно в линейном графике. Когда я изолирую точки и не рисую линии, я получаю этот результат:
![graph without lines]()
Как вы можете сказать, существует способ подключения этих точек без пересекающихся линий.
Почему matplotlib делает это? Я думаю, что я мог бы исправить это, не потеряв xcolumn, но если я его отсортирую, я потеряю отображение от x1 до y1.
Ответы
Ответ 1
Вы можете сохранить заказ с помощью функции numpy argsort
.
Argsort "... возвращает массив индексов той же формы, что и данные индекса вдоль данной оси в отсортированном порядке.", поэтому мы можем использовать это, чтобы переупорядочить координаты x и y вместе. Вот как это делается:
import matplotlib.pyplot as plt
import numpy as np
desc_x =[4000,3000,2000,2500,2750,2250,2300,2400,2450,2350]
rmse_desc = [.31703 , .31701, .31707, .31700, .31713, .31698, .31697, .31688, .31697, .31699]
order = np.argsort(desc_x)
xs = np.array(desc_x)[order]
ys = np.array(rmse_desc)[order]
fig = plt.figure()
ax = plt.subplot(111)
fig.suptitle('title')
plt.xlabel('x')
plt.ylabel('y')
ax.plot(xs, ys, 'b', label='desc' )
ax.legend()
plt.show()
![enter image description here]()