it-swarm.com.ru

Как нарисовать линию с помощью matplotlib?

Я не могу найти способ нарисовать произвольную линию с библиотекой matplotlib Python. Он позволяет рисовать горизонтальные и вертикальные линии (например, с помощью matplotlib.pyplot.axhline и matplotlib.pyplot.axvline), но я не вижу, как провести линию через две заданные точки (x1, y1) и (x2, y2). Есть ли способ? Есть ли простой способ?

20
Alexey

Я проверял, как работает ax.axvline, и я написал небольшую функцию, которая напоминает часть его идеи:

import matplotlib.pyplot as plt
import matplotlib.lines as mlines

def newline(p1, p2):
    ax = plt.gca()
    xmin, xmax = ax.get_xbound()

    if(p2[0] == p1[0]):
        xmin = xmax = p1[0]
        ymin, ymax = ax.get_ybound()
    else:
        ymax = p1[1]+(p2[1]-p1[1])/(p2[0]-p1[0])*(xmax-p1[0])
        ymin = p1[1]+(p2[1]-p1[1])/(p2[0]-p1[0])*(xmin-p1[0])

    l = mlines.Line2D([xmin,xmax], [ymin,ymax])
    ax.add_line(l)
    return l

Итак, если вы запустите следующий код, вы поймете, как он работает. Линия будет охватывать весь диапазон вашего графика (независимо от его размера), а создание линии не зависит от какой-либо точки данных на оси, а только в двух фиксированных точках, которые вам нужно указать.

import numpy as np
x = np.linspace(0,10)
y = x**2

p1 = [1,20]
p2 = [6,70]

plt.plot(x, y)
newline(p1,p2)
plt.show()

 enter image description here

15
Alejandro

Это нарисует линию, которая проходит через точки (-1, 1) и (12, 4), и еще одну, которая проходит через точки (1, 3) и (10, 2)

x1 - координаты x точек для первой строки, y1 - координаты y для того же элемента - элементы в x1 и y1 должны быть в последовательности.

x2 и y2 одинаковы для другой строки.

import matplotlib.pyplot as plt
x1, y1 = [-1, 12], [1, 4]
x2, y2 = [1, 10], [3, 2]
plt.plot(x1, y1, x2, y2, marker = 'o')
plt.show()

 enter image description here

Я предлагаю вам потратить некоторое время на чтение/изучение основных учебных пособий, найденных на очень богатом веб-сайте matplotlib, чтобы ознакомиться с библиотекой.

Что делать, если я не хочу отрезки?

Не существует прямого способа продлить линии до бесконечности ... matplotlib либо изменит размер графика, либо изменит его масштаб так, чтобы самая дальняя точка была на границе, а другая - внутри, рисуя сегменты линий; или вы должны выбрать точки за пределами поверхности, которую вы хотите установить видимой, и установить пределы для осей x и y.

Следующее:

import matplotlib.pyplot as plt
x1, y1 = [-1, 12], [1, 10]
x2, y2 = [-1, 10], [3, -1]
plt.xlim(0, 8), plt.ylim(-2, 8)
plt.plot(x1, y1, x2, y2, marker = 'o')
plt.show()

 enter image description here

30
Reblochon Masque

Просто хочу упомянуть еще один вариант здесь.

Вы можете вычислить коэффициенты, используя numpy.polyfit (), и передать коэффициенты в numpy.poly1d (). Эта функция может строить полиномы, используя коэффициенты, вы можете найти больше примеров здесь

https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.poly1d.html

Скажем, с учетом двух точек данных (-0,3, -0,5) и (0,8, 0,8)

import numpy as np
import matplotlib.pyplot as plt

# compute coefficients
coefficients = np.polyfit([-0.3, 0.8], [-0.5, 0.8], 1) 

# create a polynomial object with the coefficients
polynomial = np.poly1d(coefficients)

# for the line to extend beyond the two points, 
# create the linespace using the min and max of the x_lim
# I'm using -1 and 1 here
x_axis = np.linspace(-1, 1)

# compute the y for each x using the polynomial
y_axis = polynomial(x_axis)

fig = plt.figure()
axes = fig.add_axes([0.1, 0.1, 1, 1])
axes.set_xlim(-1, 1)
axes.set_ylim(-1, 1)
axes.plot(x_axis, y_axis)
axes.plot(-0.3, -0.5, 0.8, 0.8, marker='o', color='red')

 enter image description here

Надеюсь, поможет.

1
Ahaha