2016-11-22 9 views
1

У меня есть два dataframes, ground_truth и прогнозирование (оба являются сериями панд). Наконец, я хочу построить все точки прогноза и все ground_truth points как я уже делал. То, что я хочу сделать, - это застроить линию между каждым прогнозом и точкой ground_truth. Так что линия является связью между точкой предсказания x1, y1 и точкой ground_truth x2, y2. Для лучшего понимания я прикрепил образ. Черные линии (созданные краской) - это то, что я хочу сделать. exampleНастройте линию между предсказанием и точкой ground_truth в matplotlib

Это то, что у меня уже есть:

fig, ax = plt.subplots() 

ax.plot(pred,'ro', label='Prediction', color = 'g') 
ax.plot(GT,'^', label='Ground Truth', color = 'r') 

plt.xlabel('a') 
plt.ylabel('b') 
plt.title('test') 

plt.xticks(np.arange(-1, 100, 5)) 
plt.style.use('ggplot') 
plt.legend()     
plt.show() 

ответ

2

Я думаю, самое простое и наиболее понятно решение построить соответствующие линии между pred и GT в цикле.

import matplotlib.pyplot as plt 
import numpy as np 
plt.rcParams['legend.numpoints'] = 1 

#generate some random data 
pred = np.random.rand(10)*70 
GT = pred+(np.random.randint(8,40,size= len(pred))*2.*(np.random.randint(2,size=len(pred))-.5)) 

fig, ax = plt.subplots(figsize=(6,4)) 

# plot a black line between the 
# ith prediction and the ith ground truth 
for i in range(len(pred)): 
    ax.plot([i,i],[pred[i], GT[i]], c="k", linewidth=0.5) 
ax.plot(pred,'o', label='Prediction', color = 'g') 
ax.plot(GT,'^', label='Ground Truth', color = 'r') 

ax.set_xlim((-1,10)) 
plt.xlabel('a') 
plt.ylabel('b') 
plt.title('test') 

plt.legend()    
plt.show() 

enter image description here

0

Вы можете достичь этого, используя Matplotlib errorbar (http://matplotlib.org/1.2.1/examples/pylab_examples/errorbar_demo.html), с идеей рисунка планки погрешностей вокруг среднего значения этих двух линий вы планировавших:

Вот минимальный пример, чтобы показать мою идею:

import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt 

# example data 
x = np.arange(0.1,10, 0.5) 
y1 = pd.Series(np.exp(-x), index = x) 
y2 = pd.Series(np.exp(-x)+ np.sin(x), index = x) 
avg_line = (y1 + y2)*0.5 

err = (avg_line - y1).abs() 

fig, ax = plt.subplots(1) 
y1.plot(marker = 'o', label='Prediction', color = 'g', linestyle = '', ax = ax) 
y2.plot(marker = '^', label='Ground Truth', color = 'r', linestyle = '', ax = ax) 
ax.errorbar(x, avg_line.values, yerr=err.values, fmt= 'none', ecolor = 'k', barsabove = False, capthick=0) 
plt.style.use('ggplot') 
ax.legend() 

Надеется, что это решает проблему.

enter image description here

1

Вы можете построить каждую строку как отдельный сюжет. Вы можете сделать цикл и позвонить plot для каждой линии, соединяющей две точки. Однако в качестве аргументов вы также можете указать два массива 2d в plot(x, y, ...). Каждый столбец в x будет соответствовать тому же столбцу в y и представлен линией на графике. Поэтому вам нужно сгенерировать эти два. Это может выглядеть примерно так:

L = len(pred) 
t = np.c_[range(L), range(L)].T 
ax.plot(t, np.c_[pred, GT].T, '-k') 
+0

Мне нравится это решение! Очень компактный! (Как бы трудно понять для неопытных людей, я думаю). – ImportanceOfBeingErnest

+0

Спасибо :) Да, это не так читаемо. Но 'c_' - это функция numpy, которая генерирует массив столбцов из аргумента, а' T' - функция транспонирования. –

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

  • Нет связанных вопросов^_^