好吧,就用我目前所知道的来回答这个问题。
为了在半对数上绘制直线,有两种主要方法。如果您有一个 x 值列表并且想要获得将绘制一条直线的相应 y 值,那么您只需调用numpy.exp()
每个 x 值。
import matplotlib.pyplot as plt
import numpy as np
plt.gca().set_yscale('log')
x = np.arange(0, 51, 10)
y = np.exp(x)
plt.plot(x, y, 'k-')
plt.show()
这里有一些证据。
如果要绘制一条具有已知 y 值和未知 x 值的直线,则相反。
import matplotlib.pyplot as plt
import numpy as np
plt.gca().set_yscale('log')
y = np.arange(0, 1001, 100)
x = np.log(y)
plt.plot(x, y, 'k-')
plt.show()
这里有更多证据。
现在,在 skew-t 的背景下,还有更多工作要做。生成 skew-t 时,您需要同时使用已知的 y 值和已知的 x 值。这是一个示例函数,它采用温度(x 值)和水平(y 值)并返回适当倾斜的 x 值。
def get_skewed_x(level, temp):
base_log = (-30 * np.log(1000))
top_log = (-30 * np.log(level))
diff = base_log - temp
x = top_log - diff
return x
该函数接受应绘制数据的水平和温度值。
这个函数看起来相当复杂,但那是因为当你通过在 y 值上调用 np.log() 在半对数上创建一条直线时,x 值将远离它需要的位置。因此,您需要找到值实际在哪里与应该在哪里之间的差异。无论您在哪个级别绘制数据,您都知道应该在最低级别绘制数据的位置,因此您必须先找到最低级别的差异,然后再将其应用到较高级别。
一旦您知道“偏移量”,您只需补偿所有倾斜 x 值的差异。这些值乘以 -30 的原因是特定于应用程序的。此数字需要根据绘图的 y 限制和 x 限制进行更改。
中的“1000”np.log(1000)
也可能需要根据情节进行更改。这应该是 skew-t 图上的最低水平(最高 y 值)。
关键是,如果你知道数据应该绘制在什么温度上,以及你想绘制数据的水平,这个函数将正确地扭曲值(当然,当 -30 为你的特定绘图调整时)。
为了查看函数的实际作用,下面是在 500 级绘制温度为 10 的数据点的样子。
get_skewed_x(500, 10)
蓝点显示将绘制数据点的位置。
可能有一个更优雅的解决方案,但这是我现在最好的。