如何在Python中使我的绘图更流畅?

时间:2015-05-26 04:22:53

标签: python numpy plot scipy smooth

我有一个名为calculate_cost的函数,它计算供应商对不同S_range(库存水平)的性能。该函数有效,但是图表不平滑,有没有办法在Python中平滑它?

import numpy
import scipy.stats
import scipy.integrate
import scipy.misc
import matplotlib
import math
import pylab
from scipy.stats import poisson

def calculate_cost(s, h, d, r, k, alphaR):
    cost = 0.0
    for i in range(0, alphaR + 1):
        #i = i-1
        binom = math.factorial(r) / ((math.factorial(i)) * (math.factorial(r - i)))
        func = scipy.stats.poisson.cdf(s, d)
        cost +=  ((k/r) * binom * (func ** i) * ((1.0-func) ** (r-i)))

    for p in range (s):
        cost += h*(s-p)*scipy.stats.poisson.pmf(p, d)  #This a formula

    return cost

graphs = []

class Graph:
    def __init__(self):
        self.label = ""
        self.h = 0
        self.d = 0
        self.r = 0
        self.k = 0
        self.alphaR = 0

graph = Graph()
graph.label = "A"
graph.h = 1.0
graph.d = 10
graph.r = 30
graph.k = 283.0
graph.alphaR = 23

graphs.append(graph)

graph = Graph()
graph.label = "B"
graph.h = 1.0
graph.d = 10
graph.r = 30
graph.k = 146.0
graph.alphaR = 24
#graph.LineStyle = '*-'


graphs.append(graph)

graph = Graph()
graph.label = "C"
graph.h = 1.0
graph.d = 10
graph.r = 30
graph.k = 92.0
graph.alphaR = 25
#graph.LineStyle = '*-'


graphs.append(graph)

graph = Graph()
graph.label = "D"
graph.h = 1.0
graph.d = 10
graph.r = 30
graph.k = 80.0
graph.alphaR = 26
#graph.LineStyle = '*-'


graphs.append(graph)

graph = Graph()
graph.label = "E"
graph.h = 1.0
graph.d = 10
graph.r = 30
graph.k = 77.0
graph.alphaR = 27
#graph.LineStyle = '*-'


graphs.append(graph)


s_range = numpy.arange(0,21,1)

for graph in graphs:
    cost = []

    for s in s_range:
        cost.append(calculate_cost(s, graph.h, graph.d, graph.r, graph.k, graph.alphaR))

    matplotlib.pyplot.plot(s_range, cost,  label = graph.label)

    pylab.legend()
    matplotlib.pyplot.xlabel(' S_range')
    matplotlib.pyplot.ylabel('Cost')


pylab.show()

1 个答案:

答案 0 :(得分:2)

一种解决方案是使用带有'立方'类型的scipy.iterp1D函数:

from scipy import interpolate
....
s_range = numpy.arange(0,21,1)

for graph in graphs:
    cost = []

    for s in s_range:
        cost.append(calculate_cost(s, graph.h, graph.d, graph.r, graph.k, graph.alphaR))

    f = interpolate.interp1d(s_range, cost, kind='cubic')

    s_range_new = np.arange(0,20, 0.1)
    cost_new = f(s_range_new) 

    matplotlib.pyplot.plot(s_range_new, cost_new,  label = graph.label)

    pylab.legend()
    matplotlib.pyplot.xlabel(' S_range')
    matplotlib.pyplot.ylabel('Cost')


pylab.show()

这会给你:

Smoothed plot

请注意如何使用它,因为这只是插值点,而不是实际数据点。

希望这有帮助