B
B
bimka2020-04-20 09:13:57
Python
bimka, 2020-04-20 09:13:57

How to draw multiple arrows in matplotlib?

Using matplotlib in Jupyter, I'm trying to draw a beam with loads acting on it. This is necessary to solve the problem of strength of materials.
Distributed loads should be drawn as a set of red arrows (the number is not important), from the beginning to the end of a certain section. So far, I have only been able to achieve drawing one arrow in the middle of the plot.
5e9d3cecb31bf494239015.png

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

# дано
data = {'Точка': [0, 'A', 0, 'B'], 
        'Сосредоточенные силы, кН': [3, 0, -10, 0],
        'Изгибающие моменты, кН/м': [2, 0, 0, 0], 
        'Распределенные нагрузки, кН/м': [-3, 0, 2, 0],
        'Координата начала участка балки, м': [0, 3, 6, 10],
        'Длина пролета балки, м': [3, 3, 4, 0]}
df = pd.DataFrame(data)

# выбираем сосредоточенные силы
concentrate_forces = df['Сосредоточенные силы, кН'] != 0
df.loc[concentrate_forces]

# выбираем распределенные нагрузки
distributed_load = df['Распределенные нагрузки, кН/м'] != 0
df.loc[distributed_load]

fig, ax = plt.subplots()

# устанавливаем размеры длины осей системы координат
limits = df
plt.xlim(0, 10)
plt.ylim(min(limits.min(axis = 0)), max(limits.max(axis = 0)))

# рисуем балку
ax.plot(df['Координата начала участка балки, м'], [0 for i in df['Координата начала участка балки, м']], marker = 'o', markersize = 8, linewidth = 4)

# рибуем сосредоточенные силы
df.loc[concentrate_forces].apply(lambda x: ax.annotate('%s%s%s' % ('P = ', x['Сосредоточенные силы, кН'], ' кН'), 
                                                       xy = (x['Координата начала участка балки, м'], 0), 
                                                       xytext = (x['Координата начала участка балки, м'], x['Сосредоточенные силы, кН']), 
                                                       ha='center', 
                                                       arrowprops=dict(arrowstyle="<-", linewidth = 2)), axis = 1) 

# рисуем распределенные нагрузки
df.loc[distributed_load].apply(lambda x: ax.annotate('', 
                                                       xy = (x['Координата начала участка балки, м'] + x['Длина пролета балки, м'] / 2, 0), 
                                                       xytext = (x['Координата начала участка балки, м'] + x['Длина пролета балки, м'] / 2, x['Распределенные нагрузки, кН/м']), 
                                                       ha='center',
                                                       arrowprops=dict(arrowstyle="<-", linewidth = 2, color = 'r')), axis = 1)

Answer the question

In order to leave comments, you need to log in

1 answer(s)
A
Andy_U, 2020-04-20
@Andy_U

Have you tried to google it?
matplotlib.pyplot.arrow.html

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question