Изменение размера стрелки пропорционально ширине линии в потоковых графиках (matplotlib: 3.5.1)Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Изменение размера стрелки пропорционально ширине линии в потоковых графиках (matplotlib: 3.5.1)

Сообщение Anonymous »

У меня есть данные о потоке жидкости, в которых есть вихри, сила которых уменьшается с расстоянием в одном направлении. Простой пример приведен ниже.

Код: Выделить всё

import numpy as np
# model flow field
x = np.linspace(0, 2 * np.pi, 100)
y = np.linspace(0, 2 * np.pi, 100)
X, Y = np.meshgrid(x, y)
U = (np.cos(X) * np.sin(Y)) * np.exp(-X)
V = -np.sin(X) * np.cos(Y) * np.exp(-X)
Я хотел бы изобразить это с помощью линий тока со стрелками, указывающими направление этих линий тока, как показано ниже. Здесь я рисую ширину линии тока, пропорциональную величине потока.

Код: Выделить всё

import matplotlib.pyplot as plt
# Create a figure with axes
fig, ax1 = plt.subplots(1, 1, figsize=(3, 3))

mag = np.sqrt(U**2+V**2)
# Create a streamplot on the axis
lw = (mag/np.max(mag[10:,:]))
stream = ax1.streamplot(X, Y, U, V, linewidth=lw, arrowsize=1.5)

# Display the plots
plt.tight_layout()
plt.show()
Но мне также хотелось бы, чтобы размеры стрелок были пропорциональны величине поля вектора потока, потому что в противном случае график будет выглядеть так, как показано ниже, со стрелками, случайным образом указывающими на области, где нет потока. .
Изображение
Я изо всех сил старался получить обходной путь, поскольку функцияstreamplot изначально не поддерживает это, но мне это не удалось.
Я попробовал приведенное ниже, чтобы попытаться получить возвращаемые объекты из вызоваstreamplot, и каким-то образом напрямую перерисовать стрелки после изменения масштаба. Но этот код ничего не строит!

Код: Выделить всё

# Create a figure with axes
fig, ax = plt.subplots(1, 1, figsize=(3, 3))

# Access the arrow collection
arrow_coll = stream.arrows
line_coll = stream.lines
arrow_paths = arrow_coll.get_paths()

ax.add_collection(arrow_coll)

# Display the plots
plt.tight_layout()
plt.show()
После этого я попытался перебором получить средние местоположения исходных стрелок, а затем попробовал какую-нибудь другую стратегию построения графиков (возможно, используя вызов FancyArrowPatch), но и здесь тоже Я наткнулся на блокпост. Мне не удается получить правильное расположение стрелок в координатах исходной оси ax1. Ниже описано, как я пытался это проверить. Но диаграмма рассеяния показывает, что позиции неверны и не соответствуют позициям на приведенной выше диаграмме.

Код: Выделить всё

# Create a figure with two axes
fig, ax = plt.subplots(1, 1, figsize=(3, 3))

# Access the arrow collection
arrow_coll = stream.arrows
line_coll = stream.lines
arrow_paths = arrow_coll.get_paths()

transform = ax1.transData.inverted()
full_transform = arrow_coll.get_transform() + transform

for idx, path in enumerate(arrow_paths):
vertices = full_transform.transform(arrow_paths[idx].vertices)
pos = np.mean(vertices, axis=0)
ax.scatter(pos[0], pos[1], marker='.')

# Display the plots
plt.tight_layout()
plt.show()
Изображение

Пожалуйста, помогите, так как я немного запутался и не совсем понимаю, что возвращает вызов ax.streamplot(). В идеале я хотел бы изменить масштаб стрелок аналогично ширине линии, но решение, каким-то образом заставляющее их исчезнуть там, где поле потока равно нулю, также подойдет.


Подробнее здесь: https://stackoverflow.com/questions/792 ... matplotlib
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Изменение размера стрелки пропорционально ширине линии в потоковых графиках (matplotlib: 3.5.1)
    Anonymous » » в форуме Python
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Изменение размера PictureBox пропорционально изменению размера формы
    Anonymous » » в форуме C#
    0 Ответы
    31 Просмотры
    Последнее сообщение Anonymous
  • Построение линии на нескольких графиках
    Anonymous » » в форуме Python
    0 Ответы
    34 Просмотры
    Последнее сообщение Anonymous
  • Plt.contour () ряд линий на графиках вместо контурной линии
    Anonymous » » в форуме Python
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous
  • Plt.contour () ряд линий на графиках вместо контурной линии
    Anonymous » » в форуме Python
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»