簡體   English   中英

在對數日志圖上插入一條直線(NumPy)

[英]Interpolating a straight line on a log-log graph (NumPy)

我在Raspberry Pi上使用一個程序來測量鹽水中探針的電壓,以計算水的鹽度。 當在對數 - 對數圖上繪制功率趨勢線時,該關系不是線性的,而是變成相當直線。 這意味着探針只能使用兩個值進行校准,並且只能在對數 - 對數圖上繪制時在它們之間插入直線。

鹽度圖

不幸的是,預先存在的程序使用標准軸假設線性關系,我不知道如何更改它以插入對數 - 對數圖上的直線。 任何幫助將不勝感激,請注意,這是我已經完成的第一個編碼,所以我的知識不是很好。 我已經包含了下面涉及插值的代碼:

import smbus
import time

# imports for plotting

import numpy as np
import matplotlib.pyplot as plt
import scipy.interpolate

# do the first plot - all values zero

nprobe=4

x=np.array([10.0, 30.0, 10.0, 30.0])
y=np.array([10.0, 10.0, 20.0, 20.0])
z=np.array([0., 0., 0., 0.])

# changing probe 1 to my handmade probe 1
fresh=np.array([0.,0.,0.,0.])
sea  =np.array([100.0,100.0,100.0,100.0])
range=np.array([100.0,100.0,100.0,100.0])
range=1.0*(sea-fresh)


# grid for plots - 20 is a bit coarse - was 100 give explicit (0,1) limits as no bcs here
###########   xi, yi = np.linspace(x.min(), x.max(), 50), np.linspace(y.min(), y.max(), 50)
xi, yi = np.linspace(0, 1, 50), np.linspace(0, 1, 50)
xi, yi = np.meshgrid(xi, yi)

rbf= scipy.interpolate.Rbf(x,y, z, function='linear')
zi= rbf(xi, yi)

plt.ion()

tank=plt.imshow(zi, vmin=0, vmax=50, origin='lower', extent=[0, 44, 0, 30])

plt.scatter(x, y, c=z)
plt.colorbar()

plt.draw()

此外,稍后在該計划中:

# make r1 an array, results between 0-100 where 0 is 0% salinity and 100 is 2.5% salinity
        z=100.0*(r1-fresh)/range

        print time.strftime("%a, %d %b %Y, %H:%M:%S")
        print "measured reading at above time (r1)"
        print r1[0],r1[1],r1[2],r1[3]
        print "fresh values used for calibration"
        print fresh
        print "range between calibration values"
        print range
        print "percentage seawater (z)"
        print z

# interpolate
        rbf= scipy.interpolate.Rbf(x,y, z, function='linear')
        zi= rbf(xi, yi)
# alt interpolate
#########       zi=scipy.interpolate.griddata((x,y), z, (xi,yi), method='linear')

        print "zi"
        print zi

怎么樣

import numpy as np
import scipy
import scipy.interpolate

import matplotlib.pyplot as plt

def log_interp1d(x, y, kind='linear'):
    """
    Returns interpolator function
    """
    log_x = np.log10(x)
    log_y = np.log10(y)
    lin_int = scipy.interpolate.interp1d(log_x, log_y, kind=kind)
    log_int = lambda z: np.power(10.0, lin_int(np.log10(z)))
    return log_int

powerlaw = lambda x, amp, index: amp * (x**index)

num_points = 20

# original data
xx = np.linspace(1.1, 10.1, num_points)
yy = powerlaw(xx, 10.0, -2.0)

# get interpolator
interpolator = log_interp1d(xx, yy)

# interpolate at points
zz = np.linspace(1.2, 8.9, num_points-1)
# interpolated points
fz = interpolator(zz)

plt.plot(xx, yy, 'o', zz, fz, '+')
plt.show()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM