简体   繁体   English

Python:尝试使用matplotlib绘制图形时出现值错误

[英]Python: Value error when trying to plot graph using matplotlib

class beam(object):
    '''This class is models the deflection of a simply supported beam under
    multiple point loads, following Euler-Bernoulli theory and the principle      
    of superposition
    '''

So I am trying to plot a graph of 3 of my functions for a beam on one graph using the matplotlib module and am getting value errors when attempting to do so. 因此,我尝试使用matplotlib模块在一张图表上绘制梁的3个函数的图表,并在尝试这样做时出现值错误。 The main bulk of code is: 主要代码是:

def __init__(self, E, I, L):
    '''The class costructor
    '''
    self.E = E  # Young's modulus of the beam in N/m^2
    self.I = I  # Second moment of area of the beam in m^4
    self.L = L  # Length of the beam in m
    self.Loads = [(0.0, 0.0)]  # the list of loads applied to the beam

def setLoads(self, Loads):
    '''This function allows multiple point loads to be applied to the beam
    using a list of tuples of the form (load, position)
    '''
    self.Loads = Loads

def beamDeflection(self, Load, x):
    """Calculate the deflection at point x due to application of single
    load
    """
    Force, distanceA = Load  #P1 = Force , a = distanceA
    E = self.E
    I = self.I
    L = self.L
    distanceB = L - distanceA
    i = (Force*distanceB)/(6*L*E*I)
    j = ((L/distanceB)*(x-distanceA)**3 - x**3 + (L**2 - distanceB**2)*x)
    k = (Force*distanceB*x)/(6*L*E*I)        
    l = (L**2 - x**2 - distanceB**2)
    if x > distanceA:
        return i*j
    else:
        return k*l


def getTotalDeflection(self, x):
    """Calculate total deflection of beam due to multiple loads
    """
    #return sum(self.beamDeflection(loadall, x) for loadall in self.Loads)
    return sum(self.beamDeflection(load, x) for load in self.Loads)


def getSlope(self, x):
    """Calculate gradient at a point x on beam due to deflection
    """
    V = lambda x: self.getTotalDeflection(x)
    return scipy.misc.derivative(V, x, dx = 10**-6)


def getMoment(self, x):
    """Calculate bending moment at a point x on beam
    """
    E = self.E
    I = self.I
    W1 = lambda x: self.getSlope(x)
    W2 = scipy.misc.derivative(W1, x, dx = 10**-6)
    return (-1*E*I)*W2

This is the section of code I am getting the error for: 这是我遇到错误的代码部分:

def plotBeamData(self, xs):
    """Plot deflection, slope and bending moment against position x for a
    list of floats or numpy.array xs describing positions along beam
    """
    deflection = self.getTotalDeflection
    slope = self.getSlope
    moment = self.getMoment    
    matplotlib.pyplot.plot(xs, deflection, 'b', label = "deflection (mm)")
    matplotlib.pyplot.plot(xs, slope, 'g', label = "slope (mm/m)")
    matplotlib.pyplot.plot(xs, moment, 'r', label = "moment (kNm)")
    matplotlib.pyplot.xlabel("Distance along beam (m)")
    matplotlib.pyplot.ylabel("Value in units")
    matplotlib.pyplot.show()

An example input would be: 输入示例为:

>>> b = beam(8.0E9, 1.333E-4, 5.0)
>>> b.setLoads([(900, 3.1), (700, 3.8), (1000, 4.2)])
>>> xs = numpy.linspace(0,5,500)
>>> b.plotBeamData(xs)

The error I am receiving is: 我收到的错误是:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:/Users/Dag/Downloads/beamModel.py", line 97, in plotBeamData
matplotlib.pyplot.plot(xs, deflection, 'b', label = "deflection (mm)")
  File "C:\Users\Dag\Anaconda2\lib\site-packages\matplotlib\pyplot.py", line 3099, in plot
ret = ax.plot(*args, **kwargs)
  File "C:\Users\Dag\Anaconda2\lib\site-packages\matplotlib\axes\_axes.py", line 1373, in plot
for line in self._get_lines(*args, **kwargs):
  File "C:\Users\Dag\Anaconda2\lib\site-packages\matplotlib\axes\_base.py", line 304, in _grab_next_args
for seg in self._plot_args(remaining, kwargs):
  File "C:\Users\Dag\Anaconda2\lib\site-packages\matplotlib\axes\_base.py", line 282, in _plot_args
    x, y = self._xy_from_xy(x, y)
  File "C:\Users\Dag\Anaconda2\lib\site-packages\matplotlib\axes\_base.py", line 223, in _xy_from_xy
raise ValueError("x and y must have same first dimension")
ValueError: x and y must have same first dimension

Grateful for any help, really stuck. 感谢您的帮助,真的很坚持。 Thanks. 谢谢。

You forgot to actually call your methods to calculate the results. 您忘记了实际调用方法来计算结果。 Here is a modified version of your plotting function: 这是绘图功能的修改版本:

def plotBeamData(self, xs):
    """Plot deflection, slope and bending moment against position x for a
    list of floats or numpy.array xs describing positions along beam
    """
    deflection = self.getTotalDeflection(xs)
    slope = self.getSlope(xs)
    moment = self.getMoment(xs)
    matplotlib.pyplot.plot(xs, deflection, 'b', label = "deflection (mm)")
    matplotlib.pyplot.plot(xs, slope, 'g', label = "slope (mm/m)")
    matplotlib.pyplot.plot(xs, moment, 'r', label = "moment (kNm)")
    matplotlib.pyplot.xlabel("Distance along beam (m)")
    matplotlib.pyplot.ylabel("Value in units")
    matplotlib.pyplot.show()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM