绘制三维矢量场,颜色与矢量的z分量有关。

问题描述 投票:0回答:1

这是我的第一个问题,我希望我能正确描述我的问题。

我试着写下一个最简单的例子,我的目标是在xy平面上得到一个漂亮的矢量场图(所以只有一层,但是是三维视图)。我的目标是在xy平面上得到一个漂亮的矢量场图(所以只有一层,但却是一个三维视图),其中箭头的颜色应该是完全红色(蓝色),如果它们完全指向正(负)z方向,如果它们位于xy平面上,则为灰色。(如果它们有一些正负z分量,则略微红色或红色,等等--所以我想到了一个 "冷暖 "的colormap。但我真的不知道如何解决这个问题。我试着用这个问题和答案来解决我的问题。在matplotlib中为三维quiver图添加颜色。 我把我的颜色条添加到pcolormesh-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绘图中的箭头一样,那就更完美了。来自Mathematica的例子

先谢谢您了!

python-3.x colorbar
1个回答
0
投票

Python中的 "管状 "箭头

我发现了这个很棒的帖子。这正是我希望我的箭头最后的样子:)

© www.soinside.com 2019 - 2024. All rights reserved.