在python的matplotlib中图大小= 1 / {N *⌈log2N⌉* [(1/70)/ 60]}?

时间:2018-07-14 11:54:10

标签: python matplotlib plot logarithm

类似于:Plot size = 1/{N∗⌈log2N⌉∗[(1/70)/60]} in R?

但是在python中使用matplotlib(我想用matplotlib绘制函数会更好):

size = 1/{N∗⌈log_2(N)⌉∗[(a)/60]}

a = [1/70, 1/60, 1/50, 1/40]

如何使用python中的matplotlib绘制此函数(对于a中的每个值-应该是一个图形)?

(⌈⌉= ceil)

例如: enter image description here

y轴带有标签“ size”,x轴带有“ N”。

N> = 2,N是自然数(2,3,4,5,6,...)(但是没有必要实现这个...见上图)

我已经尝试过将其作为第一种方法:

import matplotlib.pyplot as plt
import numpy as np

n = np.arange(3,50,0.1)
size = (1)/n*np.ceil(np.log2(n))*((1/70)/60))
plt.plot(n,size)
plt.axis([3,50,0,550])
plt.show()

1 个答案:

答案 0 :(得分:2)

如果要绘制所有不同的段而不是连续的线,一种方法是在导数中查找不连续性。在这种情况下,斜率应始终随着n的增加而增加(n> 0),因此您可以查找何时违反此条件,然后在那儿分割线。

import matplotlib.pyplot as plt
import numpy as np
from numpy import diff

n = np.arange(3,50,0.1)
a = [1/70,1/60,1/50,1/40]

discont = np.ones(len(n)-1)   #array to show discontinuities
discont[1] = 0

for i in a:

    size = 1/(n*np.ceil(np.log2(n))*(i/60)) 
    derivs = diff(size)

    for k in range(len(derivs)-2): 
        if derivs[k+1] > derivs[k]:
            discont[k+2] = 0     

    segments = np.squeeze(np.asarray(discont.nonzero())) 

    for j in range(len(segments)-1):
        start, stop = segments[j], segments[j+1]
        plt.plot(n[start:stop],size[start:stop], 'b')

plt.axis([0,20,0,300])
plt.xlabel('N')
plt.ylabel('Size')
plt.grid()
plt.show()

这将产生以下情节:

log_graphs.png