首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Pyx绘制大括号

使用Pyx绘制大括号
EN

Stack Overflow用户
提问于 2009-08-17 18:42:37
回答 2查看 2.7K关注 0票数 3

如何使用Pyx在两个任意点之间绘制一条“有括号”的线?

它看起来像这样:

Brace example http://tof.canardpc.com/view/d16770a8-0fc6-4e9d-b43c-a11eaa09304d

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-08-17 20:03:46

您可以使用sigmoidals绘制漂亮的大括号。我没有安装Pyx,所以我将使用matplotlib (这里是pylab)来绘制它们。在这里,beta控制大括号中曲线的锐度。

代码语言:javascript
复制
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内置了大量的路径绘制功能,也可以满足您的需要。

票数 11
EN

Stack Overflow用户

发布于 2013-12-01 11:42:26

tom10提供了一个很好的解决方案,但可以进行一些改进。

关键是在0,1,0,1范围内创建一个大括号,然后缩放它。

这个版本还可以让你稍微调整一下形状。对于加分点,它使用二阶导数来计算出点的间距有多密集。

mid设置下部和上部之间的平衡。

beta1beta2控制曲线(下部和上部)的锐度。

您可以更改height (或仅将y乘以标量)。

让它垂直而不是水平,只需要交换x和y即可。

initial_divisionsresolution_factor控制如何选择x值,但通常应该忽略不计。

代码语言:javascript
复制
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)

用法很简单:

代码语言:javascript
复制
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,然后把它放在轴的外面。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1289681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档