Как добавить опорную линию в диаграмму Pyplot? - PullRequest
0 голосов
/ 30 мая 2018

У меня есть фрейм данных, для которого я нарисовал линейный график и добавил ссылочный номер, используя следующий код

plt.figure(figsize=(15,5))
plt.title('Parento Analysis',fontsize=20, color = 'blue')
plt.xlabel('Product', fontsize=14)
plt.ylabel('Sales Quantity', fontsize=14)
plt.plot(parento['Cum_Product%'], parento['Cum_Sales%'],linewidth=3.0)
plt.plot([10, 10], [0, 80], 'k-', lw=1,dashes=[2, 2])
plt.plot([0, 10], [80, 80], 'k-', lw=1,dashes=[2, 2])
plt.show()

enter image description here

Мое решениекажется, немного долго для меня.Есть ли какой-нибудь другой способ, которым я могу нарисовать контрольную линию для (10,80)?

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Чтобы ответить на ваш вопрос из комментариев:

Можно ли привязать только одну точку на одной оси и нарисовать опорную линию на обеих осях

Вы бынужна ваша линия Parento в функциональной форме, т.е. Объем продаж = f (Продукт) .Один из способов решить эту проблему f - использовать интерполяцию:

from scipy import interpolate
f = interpolate.interp1d(parento['Cum_Product%'],  parento['Cum_Sales%']) 

, поэтому теперь f(10) должно вернуть 80.Мы можем включить это в функцию ImportanceOfBeingErnests:

def refline(x, f, **kwargs):
    y = f(x)
    plt.plot([x, x, 0], [0, y, y], **kwargs)

Пример:

import matplotlib.pyplot as plt
import numpy as np
from scipy import interpolate

X = np.array([1,2,4,6,12,20,28,40])
Y = np.log(X)

f = interpolate.interp1d(X,Y)
# You don't even have to pass f in depending on how general you need it to be
def refline(x, **kwargs):
        y = f(x)
        plt.plot([x, x, 0], [0, y, y], **kwargs)

plt.plot(X,Y,linewidth=3.0)
refline(10, color="k", lw=1, dashes=[2, 2])
plt.show()

enter image description here

Даже если 10 wasn 't в моем исходном X, поскольку мы интерполируем, вы все равно можете нарисовать опорную линию в правильной точке вашей линии.

0 голосов
/ 30 мая 2018

Конечно,

plt.plot([10, 10], [0, 80], 'k-', lw=1,dashes=[2, 2])
plt.plot([0, 10], [80, 80], 'k-', lw=1,dashes=[2, 2])

дает то же самое, что и

plt.plot([10, 10, 0], [0, 80, 80], 'k-', lw=1,dashes=[2, 2])

Построение только одной линии также более эффективно - хотя в случае только двух точек это не оченьнезависимо от того,

Если вам нужно проводить такие опорные линии чаще, вы, конечно, можете поместить их в функцию

import numpy as np
def refline(x, **kwargs):
    y = np.interp(x, parento['Cum_Product%'], parento['Cum_Sales%'])
    plt.plot([x, x, 0], [0, y, y], **kwargs)

и назвать ее как

refline(10, color="k", lw=1, dashes=[2, 2])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...