bimka
@bimka
Осваиваю Питон

Как в matplotlib нарисовать множество стрелок?

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

matplotlib.pyplot.arrow.html
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы