用Pyx绘制花括号
如何用Pyx在两个任意点之间绘制“支撑”线?用Pyx绘制花括号
这将是这个样子:
Brace example 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还有很多内置的路径绘制功能,它们也可以满足您的需求。
嘿,我特别想知道你是怎么写half_brace方法的。你做的数学是一种常见的标准东西吗?你能帮我指出一些资源来学习吗? – asyncwait 2009-08-28 09:10:41
@Vadi - 我在答案的第一行添加了一个到sigmoid函数的链接。 half_brace函数是两个sigmoidals的总和,我只是认为总和比将它分成四个部分更容易。 Sigmoidals本身相当普遍,但这取决于你的观点。例如在物理学中(但是在比基础本科更先进的话题中),它们直接表现为费米 - 狄拉克分布函数。 – tom10 2009-08-28 21:26:36
@ tom10,你的坏蛋 – 2013-04-11 18:05:17
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
,并把它的轴线之外。
看起来像你创建一个画布,找到两个端点之间的点,为p1画一条垂直线到半途,在中途点画出某种乳头,然后从中途画一条垂直线到p2。使用c.stroke(path.line(p1.x,p2.y,halfway.x,halfway.y)))和c.stroke(path.line(halfway.x,halfway.y,p1.x,p2。 Y)))。或者其他的东西。我没有安装这个软件包来回答这个问题。 – hughdbrown 2009-08-17 18:55:57
@hughbrown:你为什么不把你的答案作为答案? – 2009-08-17 19:00:16
我没有安装此软件包。我想我可以勾画出一个近似的答案,巴斯蒂安可以用它来运行。 – hughdbrown 2009-08-17 19:53:38