2017-02-22 34 views
0

Я хочу получить график, похожий на следующий график, который имеет разные цвета на основе значений для оси x. Игнорируйте буквы u и f, а также синюю кривую и серые линии. Мне нужны только зеленые и красные линии. Итак, если вы используете мой код, вы получите сюжет, который является одним цветом. Я хочу иметь разный цвет, когда x находится между 0 и точкой поворота (в данном случае это x=50%), а затем другой цвет для остальных.График Matplotlib с несколькими цветами на основе значений по оси x

Код:

import matplotlib.pyplot as plt 

def GRLC(values): 
    n = len(values) 
    assert(n > 0), 'Empty list of values' 
    sortedValues = sorted(values) #Sort smallest to largest 

    #Find cumulative totals 
    cumm = [0] 
    for i in range(n): 
     cumm.append(sum(sortedValues[0:(i + 1)])) 

    #Calculate Lorenz points 
    LorenzPoints = [[], []] 
    sumYs = 0   #Some of all y values 
    robinHoodIdx = -1 #Robin Hood index max(x_i, y_i) 
    for i in range(1, n + 2): 
     x = 100.0 * (i - 1)/n 
     y = 100.0 * (cumm[i - 1]/float(cumm[n])) 
     LorenzPoints[0].append(x) 
     LorenzPoints[1].append(y) 
     sumYs += y 
     maxX_Y = x - y 
     if maxX_Y > robinHoodIdx: robinHoodIdx = maxX_Y 

    giniIdx = 100 + (100 - 2 * sumYs)/n #Gini index 

    return [giniIdx, giniIdx/100, robinHoodIdx, LorenzPoints] 

reg=[400,200] 
result_reg = GRLC(reg) 
print 'Gini Index Reg', result_reg[0] 
print 'Gini Coefficient Reg', result_reg[1] 
print 'Robin Hood Index Reg', result_reg[2] 

#Plot 
plt.plot(result_reg[3][0], result_reg[3][1], [0, 100], [0, 100], '--') 

plt.legend(['[email protected]','Equity-Line'], loc='upper left',prop={'size':16}) 
plt.xlabel('% of items ') 
plt.ylabel('% of times being recommended') 
plt.show() 
+0

Вы должны построить две линии. – Goyo

+0

В этом случае это две строки, но что, если это кривая, которая должна быть разных цветов для разных интервалов. Я не думаю, что рисование нескольких строк - это решение, если честно. – HimanAB

+0

Честно говоря, рисование 2 строк (по одному для каждого цвета) ** является ** решением. В настоящее время у меня возникают трудности с пониманием того, в какой точке вы хотите изменить цвет. Вы определяете этот пункт в своем скрипте где-то? – ImportanceOfBeingErnest

ответ

1

Это, как вы бы построить две линии различных цветов, зная индекс в массиве, в которой цвет должен измениться.

import matplotlib.pyplot as plt 
import numpy as np 

x = np.linspace(0,49, num=50) 
y = x**2 

x0 = 23 

plt.plot(x[:x0+1], y[:x0+1]) 
plt.plot(x[x0:], y[x0:]) 
plt.show() 

enter image description here

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

plt.plot(x[:x0+1], y[:x0+1], color="cornflowerblue")