2013-12-18 4 views
11

При построении некоторых точек с помощью 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.

+0

Есть ли функциональная зависимость между '' desc_x' и rmse_desc'? –

ответ

16

Вы можете сохранить заказ, используя функцию numping 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

+0

Отлично, спасибо. Было ли мое предположение правильным, что граф выглядел настолько странно, что x vals были несортированы? – nook

+1

А, да, это правильно. Matplotlib будет рисовать линии между каждой парой в том порядке, в котором вы указали. – YXD

+0

Вы также можете сделать что-то подобное с помощью 'xs, ys = zip (* sorted (zip (desc_x, rmse_desc))), но я предпочитаю метод numpy – YXD

Смежные вопросы