matplotlib 如何获得相同的颜色为箭杆和箭头与3D绘图

zazmityj  于 2023-10-24  发布在  其他
关注(0)|答案(2)|浏览(131)

下面的程序绘制3d箭头。我根据海拔(z坐标)设置箭头的颜色。
工作原理:箭杆获得正确的颜色
问题:箭头(整体或部分)的颜色不同,很难看。

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D # noqa: F401 unused import
import matplotlib.cm as cm

n = 5
n3 = n*n*n
u, v, w = np.arange(n3), np.arange(n3), np.arange(n3)  # Positions
x, y, z = np.arange(n3), np.arange(n3), np.arange(n3)  # Vector components
colors = [(0, 0, 255)]*n3
mid = n/2
for i in range(n):
    for j in range(n):
        for k in range(n):
            ii = i*n*n + j*n + k
            u[ii], v[ii], w[ii] = -(j-mid), i-mid, 0   # Whorl
            x[ii], y[ii], z[ii] = i, j, k
            colors[ii] = (1, 0, 0)
            if abs(k-(n-1)/2) < 1.1: colors[ii] = (0, 1, 0)
            if abs(k-(n-1)/2) < 0.1: colors[ii] = (0, 0, 1)

figure = plt.figure()
axes = figure.gca(projection='3d')  # gca = get/create current axes

q = axes.quiver(x, y, z, u, v, w, color=colors, length = 0.5, normalize=True)
plt.show()  # Finally display the plot

输出:

dojqjjoe

dojqjjoe1#

我认为问题是你没有指定箭头的颜色,所以matplotlib循环遍历你的colors变量来给箭头上色。
在你的for循环之后,使用下面的代码来固定箭头的颜色。每个向量由3个元素组成:一条线作为向量的主体,两条线作为箭头。所以如果你有n向量,你需要提供n*3颜色来正确地指定颜色。
假设你要绘制两个向量,下面是向量元素的颜色在颜色数组中的排序方式:line1col,line2col,l1arrow1col,l1arrow2col,l2arrow1col,l2arrow2col,l3arrow1col,l3arrow2col。

# fix arrowhead colors
cs = colors[:]
for c in colors:
    cs.append(c)
    cs.append(c)

figure = plt.figure(figsize=(13, 13))
axes = figure.gca(projection="3d")  # gca = get/create current axes
q = axes.quiver(x, y, z, u, v, w, color=cs, length=0.5, normalize=True)
plt.show()  # Finally display the plot

这里有一个简单的例子,有3个矢量,说明如何为矢量着色。

fig = plt.figure()
ax = fig.add_subplot(111, projection="3d")
ax.quiver(
    [0, 0, 0],
    [0, 0, 0],
    [0, 0, 0],
    [-3, 0, 0],
    [-4, 4, -1],
    [-2, 2, 1],
    color=plt.cm.viridis(
        [200, 50, 100, 200, 200, 50, 50, 100, 100]
    ),  # line1, line2, line3, l1arrow1, l1arrow2, l2arrow1, l2arrow2, l3arrow1, l3arrow2
    arrow_length_ratio=0.3,
)
ax.set(ylim=(-5, 5), xlim=(-5, 5), zlim=(-5, 5))
plt.show()
ttp71kqs

ttp71kqs2#

That是正确的,但对我来说,只有在我将相同的颜色列表cs添加到edgecolor变量后,它才能工作;即:ax.quiver(...., color=cs, edgecolor=cs)

相关问题