Я могу создать свою диаграмму рассеяния, но я не могу нарисовать свою линию с помощью matplotlib на том же рисунке

#python #matplotlib #plot #regression #scatter-plot

#питон #matplotlib #сюжет #регрессия #точечный график

Вопрос:

Я новичок, так что это может быть глупый вопрос. Если я выполню следующий код, мне будет показана диаграмма рассеяния x и y , но линия регрессии plt.plot(x, estimated_y, color="r", linewidth=3.0) не отображается. Я оценил y , используя ковариационную матрицу. x , y и estimated_y все они являются массивами numpy. Если я бегу plt.plot(x, estimated_y, color="r", linewidth=3.0) один, мне показывают пустую фигуру.

 plt.figure()
plt.scatter(x,y)
plt.plot(x, estimated_y, color="r", linewidth=3.0) 
plt.show()
plt.xlabel("x")
plt.ylabel("y")
 

Спасибо за всю помощь!

Комментарии:

1. Трудно сказать, что вы сделали, если вы не показываете весь код и набор данных. Для начала: вы уверены estimated_y , что данные содержатся и находятся в пределах указанной цифры?

Ответ №1:

Ваш код выглядит вполне нормально. Я добавил некоторые случайные данные, чтобы создать минимально воспроизводимый пример:

 import matplotlib.pyplot as plt

# create dummy data
x = list(range(0,10))
y = list(range(10,0,-1))
estimated_y = [1]*10

plt.figure()
plt.scatter(x,y)
plt.plot(x, estimated_y, color="r", linewidth=3.0) 
plt.show()
# do not add anything to the axes after this command. The command forces to terminate the "rendering", which is why everything afterwards opens a new plot
 

Результат выглядит хорошо:
фиктивное изображение данных

Однако вы можете убедиться, что строите график по одним и тем же осям (фигура может содержать несколько осей или «подзаголовков»), используя

 # open a figure   create a single axis
fig, ax = plt.subplots()
ax.scatter(x,y)
ax.plot(x, estimated_y, color="r", linewidth=3.0) 
plt.show()
 

Любая функция построения графика, которую вы вызываете из базы, например matplotlib.pyplot.plot() , или plt.plot() поскольку вы переименовали / импортировали часть библиотеки as plt , будет отображаться на оси, которая в данный момент активна. Это должно сработать в вашем случае.

Хорошо, что при работе с осями вы можете подсчитать количество линий, которые были нанесены на них: len(ax.get_lines())

1

Он один, потому scatter() что отображает не «линии», а «точки»… Теперь, если вы вызовете его со своими данными, он также должен вернуться 1 . Если это так, и вы не видите красную линию, возможно, ваши данные содержат NaN s или они были нанесены за пределы. Если он возвращается 0 , вы нанесли его на какую-то другую (возможно, невидимую или еще не нарисованную) ось.

Комментарии:

1. Спасибо за ваш комментарий. Это все еще не работает странно. На самом деле, я пытался использовать ваш вариант с подзаголовком, и теперь он говорит мне, что на графике есть 20 строк, если я попрошу len(ax.get_lines()). Вероятно, причина этого: мой numpy-массив estimated_y содержит 20 чисел.

2. хм, я сомневаюсь в этом. Вы могли бы проверить эту гипотезу, вызвав ax.plot(x, estimated_y.tolist())