请原谅,我的数学一直很差,现在正尝试通过编码来学习一些 Python(以及一些数学)。
我有这个:
import numpy as np
import matplotlib.pyplot as plt
whole = 1 # percentage: 1 = 100%, 0.1 = 10% ecc
nparts = 10 # how many "steps" we want to use
origin = 100 # starting value we
ranged = origin * whole # defining the percentage of our starting value
values = np.linspace(origin - ranged/2, origin + ranged/2, nparts * 2)
r = []
g = []
for v in values:
if v > origin:
r.append(v)
#reds = f"{v} is {100*(v - origin)/origin}% of {origin}"
#print(reds)
else:
g.append(v)
#greens = f"{v} is {100*(v - origin)/origin}% of {origin}"
#print(greens)
print("reds")
print(r)
print("greens")
print(g)
最后这些 print(g) and print(r)
输出数值结果。
如果我绘制它,您可以清楚地看到它的作用。
axes = plt.gca()
#origin BLUE
plt.axhline(y=origin, color='b', linestyle='-')
#reds
for i in r:
plt.axhline(y=i, color='r', linestyle='-')
#greens
for i in g:
plt.axhline(y=i, color='g', linestyle='-')
所以你可以看到给定一个 origin
(蓝线)并给出 +/- 百分比 whole
它创建 n 行 ( nparts
) 和 reds if they are > origin
和 green if < origin
线性传播它们 values = np.linspace(origin - ranged/2, origin + ranged/2, nparts * 2)
关于这个whole
来自 origin
的百分比值
现在我的问题是:我怎样才能以对数方式展开这些线(别误会我的意思,我的数学很差,我什至不知道我要找的东西是否与对数相关)
我想实现这样的目标(我对绘制的图像进行了 Photoshop)。
我真的很想保留那个 whole
也许能够添加一个新的 variable
“控制”这种对数扩散
基本上我需要找到一种方法来找到另一个函数来替换 values = np.linspace(origin - ranged/2, origin + ranged/2, nparts * 2)
以达到下面所附的预期结果。
我尝试了 np.geomspace 和 np.logspace 都没有成功,也许我只是不好或者我需要找到另一种方法来做到这一点。
期望的结果: desired result
你能帮我解决这个问题吗? 非常感谢。
最佳答案
您可以将任何 linspace
传递给 np.log
。这将给出每个点的对数。要获得特定范围内的结果,您可以使用线性变换:除以最大值并乘以所需范围,或者添加一个基线值。
例如:
values = np.log(np.linspace(1, 10, nparts))
r = 150 - 50 * (values / values[-1])
g = 50 + 50 * (values / values[-1])
这将导致以下情节:
如果您需要包含 origin
和 whole
变量,这是一种方法:
values = np.log(np.linspace(1, 10, nparts))
half_range = origin * whole / 2
g = origin + half_range * (1 - values / values[-1])
r = origin * 2 - g
关于python 需要将 "linspace"转换成更多的 "logarithmic",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67557856/