python - 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()
解决方案
如果您要绘制所有不同的线段而不是连续线,则一种方法是寻找导数中的不连续性。在这种情况下,斜率应始终随着 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()
这将产生以下情节:
推荐阅读
- angularjs - 在 angular.forEach 函数中使用 $http.post() 上传图像
- android - 是否可以“欺骗”Android Room Persistence Library 的 UI 初始化/启动异步性?
- facebook-graph-api - 在开发模式下访问应用程序的 Facebook API Pages 节点的权限
- c# - 使用 asp.net 核心 cookie 身份验证注销后防止自动 Windows 身份验证登录
- sql - 如何让 ADO 将 .csv 文件中的所有日期识别为美国日期?
- xamarin.forms - 带有导航页面的单个静态页面
- javascript - 如何从数据库向本地计算机发出实时通知
- sql - 有没有办法用窗口函数(sql)计算保留率
- c# - 从许多 Excel 文件(xls 格式)中读取数据的理想方法
- python-3.x - 通过 href 属性的一部分查找元素