首页 > 解决方案 > 将图形合二为一

问题描述

我希望这两个单独的情节合二为一。我怎样才能做到这一点 ?这两个图表示列表 dis 中的数字。首先对应于 20,其他对应于 40。类似地,它可以用于各种其他数字。
在此处输入图像描述

dis=[20,40]
b=0
f=25/60
time=10
t_i=0.001
mean=0.03
std=0.00666
r=0.2
w=2*np.pi*300/60
v=2*np.pi*r*300/60
avg=0.03

high=2
xm=np.linspace(0,2,500)
ym=high
while b<=len(dis)-1:
    n=2*3.14*dis[b]*r/(avg*100)
    s=np.random.normal(mean,std,round(n))
    fig,ax=plt.subplots(figsize=(12,2))
    for i in s:   
        t=np.arange(0.1,time,t_i) 
        k=r+i
        c=v/k
        m=np.sqrt((k**2-(k-0.01)**2)/k)
        j=np.arcsin(m)
        x=k*(np.sin((c*t)+j))+f*t
        y=k*(np.cos((c*t)+j))
        ax.set_xlim([0.3,2])
        ax.set_ylim([y.min()-0.05,-0.1])
        reversed = False
        ind0=0
        while ind0 < len(x):
            ind1 = ind0 + 1
            if reversed:
                while ind1 < len(x) and x[ind1] <= x[ind1 - 1]:
                    ind1 += 1
                ym = np.minimum(ym, np.interp(xm, x[ind0:ind1][::-1], y[ind0:ind1][::-1], left=high, right=high))
            else:
                while ind1 < len(x) and x[ind1] >= x[ind1 - 1]:
                    ind1 += 1
                ym=np.minimum(ym, np.interp(xm, x[ind0:ind1], y[ind0:ind1], left=high, right=high))
            ind0 = ind1
            reversed = not reversed
    ax.set_xlabel('x (mm)')
    ax.set_ylabel('y (mm)')
    ax.plot(xm, ym, color='r', alpha=0.5)
    b+=1

标签: pythonmatplotlib

解决方案


我假设您想将两条线都绘制到一个绘图区域中。在这种情况下,您应该如下调整您的代码。

请注意,您fig, ax在 while 循环中创建了新对象,因此每次绘制某些内容时,它都在一个新图形中。相反,您希望在 while 循环之前设置图形和轴,以便继续在同一个图形中添加绘图。实现这一点的最简单的代码调整如下:

# variables left out for brevity

fig, ax = plt.subplots(figsize=(12, 2))

while b<=len(dis)-1:
    n=2*3.14*dis[b]*r/(avg*100)
    s=np.random.normal(mean,std,round(n))
    for i in s:   
        t=np.arange(0.1,time,t_i) 
        k=r+i
        c=v/k
        m=np.sqrt((k**2-(k-0.01)**2)/k)
        j=np.arcsin(m)
        x=k*(np.sin((c*t)+j))+f*t
        y=k*(np.cos((c*t)+j))
        ax.set_xlim([0.3,2])
        ax.set_ylim([y.min()-0.05,-0.1])
        reversed = False
        ind0=0
        while ind0 < len(x):
            ind1 = ind0 + 1
            if reversed:
                while ind1 < len(x) and x[ind1] <= x[ind1 - 1]:
                    ind1 += 1
                ym = np.minimum(ym, np.interp(xm, x[ind0:ind1][::-1], y[ind0:ind1][::-1], left=high, right=high))
            else:
                while ind1 < len(x) and x[ind1] >= x[ind1 - 1]:
                    ind1 += 1
                ym=np.minimum(ym, np.interp(xm, x[ind0:ind1], y[ind0:ind1], left=high, right=high))
            ind0 = ind1
            reversed = not reversed
    ax.set_xlabel('x (mm)')
    ax.set_ylabel('y (mm)')
    ax.plot(xm, ym, color='r', alpha=0.5)
    b+=1

这给出了下图:

同一图中的两条线


推荐阅读