子图x取决于数组长度的次数

时间:2019-04-17 11:35:49

标签: python python-3.x numpy

我试图用箭头所示的力绘制光束的偏转图,但是对于每个箭头,我都需要ax.annotate()

问题是我的力数组(loadPositions)可以在0到“无穷大”之间变化,并且看来最佳方法似乎并不是使{{1} }。

所以我的问题是:是否可以使x循环或使箭头的数量等于我的ax.annotate数组的长度的东西?

for

1 个答案:

答案 0 :(得分:0)

您应该回到基础。

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
plt.style.use('classic')
fig = plt.figure()

E = 200*10**9
I = 0.0001


beamLength = 5
loadPositions = np.array([1,5,2,4,2.5,3.5])
loadForces = np.array([-800000,300000,200000,-528584,255040,-256356])
beamSupport = 'cantilever'

n = 1000

nrOfEval = np.linspace(0, beamLength,n)

deflection = np.ones([len(nrOfEval),len(loadPositions)])

if beamSupport == 'both':

    for i in range(len(nrOfEval)):

        for j in range(len(loadPositions)):

            if nrOfEval[i] < loadPositions[j]:

                deflection[i,j] = loadForces[j]*(beamLength-loadPositions[j])*nrOfEval[i]/(6*E*I*beamLength)*(beamLength**2-nrOfEval[i]**2-(beamLength-loadPositions[j])**2)

            if nrOfEval[i] >= loadPositions[j]:

                deflection[i,j] = loadForces[j]*loadPositions[j]*(beamLength-nrOfEval[i])/(6*E*I*beamLength)*(beamLength**2-(beamLength-nrOfEval[i])**2-loadPositions[j]**2)

elif beamSupport == 'cantilever':

    for i in range(len(nrOfEval)):

        for j in range(len(loadPositions)):

            if nrOfEval[i] < loadPositions[j]:

                deflection[i,j] = loadForces[j]*nrOfEval[i]**2/(6*E*I)*(3*loadPositions[j]-nrOfEval[i])

            if nrOfEval[i] >= loadPositions[j]:

                deflection[i,j] = loadForces[j]*loadPositions[j]**2/(6*E*I)*(3*nrOfEval[i]-loadPositions[j])


else:
    deflection = 'wrong support input'


deflection = np.sum(deflection,axis=1)




maxDeflectionIndex = np.abs(deflection).argmax()
print ("The maximum is at position::", maxDeflectionIndex)

maxDeflectionValue = deflection[maxDeflectionIndex]
print(maxDeflectionValue)


scaleForces = max(abs(loadForces))



fig, ax = plt.subplots()
ax.plot(nrOfEval,deflection)
plt.xlabel('Length[m]')
plt.ylabel('Deflection[mm]')
ax.axis('equal')

print('her')

ax.annotate('Maximum deflection', xy=(maxDeflectionIndex/n*beamLength, maxDeflectionValue), xytext=(maxDeflectionIndex/n*beamLength-0.7, 1),
                   arrowprops=dict(arrowstyle="->",
                                   connectionstyle="angle3,angleA=0,angleB=-90"));

for i in range(len(loadPositions)):
    f_string = 'F' + str(i+1)
    print(f_string)
    ax.annotate(f_string, xy=(loadPositions[i], deflection[int(round(n/beamLength*loadPositions[i]))-1]), xytext=(loadPositions[i], loadForces[i]/scaleForces+deflection[int(round(n/beamLength*loadPositions[i]))-1]),
                   arrowprops=dict(facecolor='black', shrink=0))

plt.show()