类似于: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)
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()
答案 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()
这将产生以下情节: