С помощбю matplotlib в Jupyter пытаюсь нарисовать балку с действующими на нее нагрузками. Это нужно для решения задачи по сопромату.
Распределенные нагрузки должны быть нарисованы в виде множества красных стрелок (количество не важно), от начала и до конца определенного участка. Пока я смог только добиться рисования одной стрелки по середине участка.
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)