首页 > 解决方案 > python中matplotlib中的绘图大小= 1/{N∗⌈log2N⌉∗[(1/70)/60]}?

问题描述

类似于:R 中的绘图大小 = 1/{N∗⌈log2N⌉∗[(1/70)/60]}?

但是在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()

标签: pythonmatplotlibplotlogarithm

解决方案


如果您要绘制所有不同的线段而不是连续线,则一种方法是寻找导数中的不连续性。在这种情况下,斜率应始终随着 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


推荐阅读