如何用Pyx在两个任意点之间绘制"支撑"线?
它看起来像这样:
大括号示例http://tof.canardpc.com/view/d16770a8-0fc6-4e9d-b43c-a11eaa09304d
你可以使用sigmoidals绘制漂亮的大括号.我没有安装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()
alt text http://i26.tinypic.com/23iyp76.png
我沿着x轴绘制了这个以节省屏幕空间,但是沿着y轴获得括号只是交换x和y.最后,Pyx内置了大量的路径绘图功能,可以满足您的需求.
tom10提供了一个很好的解决方案,但可以进行一些改进。
关键是在[0,1],[0,1]范围内创建一个括号,然后对其进行缩放。
此版本还允许您稍微调整形状。对于奖励积分,它使用二阶导数来计算间距的密度。
mid
设置下部和上部之间的平衡。
beta1
并beta2
控制曲线的锐度(上下)。
您可以更改height
(或仅将y乘以标量)。
使它垂直而不是水平仅涉及交换x和y。
initial_divisions
并resolution_factor
控制如何选择x值,但通常应该是可忽略的。
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
并把它外面的轴。