【问题标题】:Plot size = 1/{N∗⌈log2N⌉∗[(1/70)/60]} in matplotlib in python?python中matplotlib中的绘图大小= 1/{N∗⌈log2N⌉∗[(1/70)/60]}?
【发布时间】:2018-07-14 11:54:10
【问题描述】:

类似于: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()

【问题讨论】:

  • 您的方程式中有错字,应该是size = 1/(n*np.ceil(np.log2(n))*((1/70)/60))。此外,plt.axis() 并不像您认为的那样工作。您需要调整plt.xlim()plt.ylim()。除此之外,请说明您找到的解决方案有什么问题
  • 我“找到”的解决方案是使用在线工具绘制的,并通过绘图添加了一些信息... ;)

标签: python matplotlib plot logarithm


【解决方案1】:

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

这将产生以下情节:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-17
    • 1970-01-01
    • 2013-02-21
    • 1970-01-01
    • 2023-01-19
    • 1970-01-01
    • 1970-01-01
    • 2020-03-11
    相关资源
    最近更新 更多