3

Pyxを使用して2つの任意の点の間に「ブレース」線を描画するにはどうすればよいですか?

次のようになります。

ブレースの例http://tof.canardpc.com/view/d16770a8-0fc6-4e9d-b43c-a11eaa09304d

4

2 に答える 2

11

シグモイダルを使用してきれいな中かっこを描くことができます。Pyxをインストールしていないので、matplotlib(ここではpylab)を使用してこれらをプロットします。ここでbetaは、中括弧内の曲線のシャープネスを制御します。

import numpy as nx
import pylab as px


def half_brace(x, beta):
    x0, x1 = x[0], x[-1]
    y = 1/(1.+nx.exp(-1*beta*(x-x0))) + 1/(1.+nx.exp(-1*beta*(x-x1)))
    return y

xmax, xstep = 20, .01
xaxis = nx.arange(0, xmax/2, xstep)
y0 = half_brace(xaxis, 10.)
y = nx.concatenate((y0, y0[::-1]))

px.plot(nx.arange(0, xmax, xstep), y)
px.show()

ここに画像の説明を入力してください

画面スペースを節約するためにこれをx軸に沿ってプロットしましたが、y軸に沿って中括弧を取得するには、xとyを入れ替えるだけです。最後に、Pyxには、ニーズに合わせて機能するパス描画機能が多数組み込まれています。

于 2009-08-17T20:03:46.413 に答える
5

tom10は優れたソリューションを提供しますが、いくつかの改善を使用できます。
重要なのは、[0,1]、[0,1]の範囲で中括弧を作成し、それを拡大縮小することです。
このバージョンでは、形状を少し調整することもできます。ボーナスポイントの場合、2階導関数を使用して、ポイントの間隔をどの程度密にするかを計算します。

mid下部と上部のバランスを設定します。
beta1カーブ(下部と上部)の鋭さをbeta2制御します。(またはyにスカラーを掛けるだけで)
変更できます。 水平ではなく垂直にするには、xとyを入れ替えるだけです。x値の選択方法を管理しますが、通常は無視できるはずです。height

initial_divisionsresolution_factor

import numpy as NP

def range_brace(x_min, x_max, mid=0.75, 
                beta1=50.0, beta2=100.0, height=1, 
                initial_divisions=11, resolution_factor=1.5):
    # determine x0 adaptively values using second derivitive
    # could be replaced with less snazzy:
    #   x0 = NP.arange(0, 0.5, .001)
    x0 = NP.array(())
    tmpx = NP.linspace(0, 0.5, initial_divisions)
    tmp = beta1**2 * (NP.exp(beta1*tmpx)) * (1-NP.exp(beta1*tmpx)) / NP.power((1+NP.exp(beta1*tmpx)),3)
    tmp += beta2**2 * (NP.exp(beta2*(tmpx-0.5))) * (1-NP.exp(beta2*(tmpx-0.5))) / NP.power((1+NP.exp(beta2*(tmpx-0.5))),3)
    for i in range(0, len(tmpx)-1):
        t = int(NP.ceil(resolution_factor*max(NP.abs(tmp[i:i+2]))/float(initial_divisions)))
        x0 = NP.append(x0, NP.linspace(tmpx[i],tmpx[i+1],t))
    x0 = NP.sort(NP.unique(x0)) # sort and remove dups
    # half brace using sum of two logistic functions
    y0 = mid*2*((1/(1.+NP.exp(-1*beta1*x0)))-0.5)
    y0 += (1-mid)*2*(1/(1.+NP.exp(-1*beta2*(x0-0.5))))
    # concat and scale x
    x = NP.concatenate((x0, 1-x0[::-1])) * float((x_max-x_min)) + x_min
    y = NP.concatenate((y0, y0[::-1])) * float(height)
    return (x,y)

使い方は簡単です:

import pylab as plt

fig = plt.figure()
ax = fig.add_subplot(111)

x,y = range_brace(0, 100)
ax.plot(x, y,'-')

plt.show()

例によって作成されたプロット

PS:それを軸の外に渡しclip_on=Falseて置くことができることを忘れないでください。plot

于 2013-12-01T03:42:25.947 に答える