построение 3d-векторного поля с цветами в зависимости от z-компоненты векторов - PullRequest
0 голосов
/ 07 мая 2020

Это мой первый вопрос, и я надеюсь, что смогу правильно описать свою проблему.

Я попытался написать минимальный пример. Моя цель - получить красивый график векторного поля в плоскости xy (то есть только один слой, но трехмерное изображение), где цвета моих стрелок должны быть полностью красными (синими), если они полностью указывают в положительном (отрицательном) ) z-направление и серый, если они расположены в плоскости xy. (Слегка красный или красный, если у них есть какой-то положительный или отрицательный компонент z и т. Д. c - поэтому я подумал о цветовой карте 'coolwarm'. Но я действительно не знаю, как это сделать. Я попытался решить свою проблему с этим вопрос и ответы Добавление цветов к графику трехмерного колчана в matplotlib и с тем, как я добавляю свои цветные полосы в pcolorme sh -plots, где он работает нормально., но я действительно не справился чтобы сделать это правильно, как вы можете видеть здесь: график, полученный из моего кода

Я действительно не понимаю часть кода, который они использовали там, и было бы неплохо, если бы кто-то мог мне помочь с этим :) не понимаю, что делает эта часть q.set_array(np.linspace(-1,1,3)) и зачем мне q.set_edgecolor(c) и q.set_facecolor(c). Кроме того, я

from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import BoundaryNorm
from matplotlib.ticker import MaxNLocator

# Make the grid
x, y, z = np.meshgrid(np.arange(-0.8, 1, 0.2),
                      np.arange(-0.8, 1, 0.2),
                      np.arange(0.0, 0.6, 0.5))

# Make the direction data for the arrows
u = np.sin(np.pi * x) * np.cos(np.pi * y) * np.cos(np.pi * z)
v = -np.cos(np.pi * x) * np.sin(np.pi * y) * np.cos(np.pi * z)
w = 0.2 + np.sqrt(2.0 / 3.0) * np.cos(np.pi * x) * np.cos(np.pi * y) * np.sin(np.pi * z)

#define colorbar like I usually do it for 2d density plot etc where it works
cmap = 'coolwarm'
cm = plt.get_cmap(cmap)
plot_min = -1.
plot_max = 1.
levels = MaxNLocator(nbins=100).tick_values(plot_min, plot_max)
norm = BoundaryNorm(levels, ncolors=cm.N, clip=True)

# Color by z-component of vectors (u,v,w) angle
c = w
# Flatten and normalize
c = (c.ravel() - c.min()) / c.ptp()
# Repeat for each body line and two head lines
c = np.concatenate((c, np.repeat(c, 2)))
# Colormap
c = getattr(plt.cm, cmap)(c)

fig = plt.figure(figsize=(10,7))
ax = fig.gca(projection='3d')
q = ax.quiver(x, y, z, u, v, w, colors=c, cmap = cmap, length=0.1, normalize=norm)
q.set_array(np.linspace(-1,1,3))

cbar = fig.colorbar(q, ticks=[-1, 0, 1], fraction=0.015)
cbar.ax.set_yticklabels(['-1', '0', '1'])
cbar.ax.tick_params(labelsize=15)
q.set_edgecolor(c)
q.set_facecolor(c)
#ax.set_zlim(-0.4, 0.4)
ax.view_init(azim=90, elev=20)
ax.grid(False)
plt.axis('off')
plt.show()

, если бы это сработало, было бы супер! Есть ли способ сделать стрелки красивее? Было бы идеально, если бы стрелки выглядели так же, как в Mathematica-plots, вот так: пример из Mathematica

Заранее большое спасибо!

1 Ответ

0 голосов
/ 24 мая 2020

Стрелки в виде "трубки" в Python

Я нашел этот потрясающий пост. Именно так я хочу, чтобы мои стрелы в итоге выглядели :)

...