如何基于数组V为Matplotlib绘制的6个箭头渲染对应颜色?
问题分析与修正
你的代码存在两个核心问题导致箭头全黑:
- 循环中重复绘制所有6个箭头,且始终使用固定的黑色(
fc='k'、ec='k'),没有将计算出的colorVal应用到箭头上 - 颜色条在循环内重复创建,属于冗余操作
下面是修正后的代码,将每个箭头与数组V中的值一一对应,实现渐变颜色渲染:
import numpy as np import matplotlib as mpl import matplotlib.pyplot as plt import matplotlib.colors as colors from matplotlib import cm # 数值数组,对应6个箭头的颜色权重 V = np.array([[10], [20], [30], [40], [50], [60]]) # 初始化颜色映射和归一化 cmap = plt.cm.jet cNorm = colors.Normalize(vmin=np.min(V), vmax=np.max(V)) scalarMap = cm.ScalarMappable(norm=cNorm, cmap=cmap) fig = plt.figure() ax = fig.add_axes([0.1, 0.1, 0.7, 0.855]) # [left, bottom, width, height] axc = fig.add_axes([0.85, 0.10, 0.05, 0.85]) # 定义6个箭头的坐标和方向参数,顺序与V数组对应 arrows_params = [ (200, 400, -50, -50), (200, 400, 50, -50), (200, 400, 0, -50), (200, 300, 50, 0), (200, 300, 50, -50), (400, 300, -50, -50) ] # 遍历每个箭头,分配对应颜色 for idx in range(len(V)): x, y, dx, dy = arrows_params[idx] colorVal = scalarMap.to_rgba(V[idx]) ax.arrow(x, y, dx, dy, width=5, head_length=20, fc=colorVal, ec=colorVal) # 仅创建一次颜色条 cb1 = mpl.colorbar.ColorbarBase(axc, cmap=cmap, norm=cNorm, orientation='vertical') ax.set_xlim(left=0, right=500) ax.set_ylim(bottom=0, top=500) plt.show()
关键修改点:
- 把6个箭头的参数整理成列表
arrows_params,确保顺序和V数组一一对应 - 循环中取出对应箭头的参数,将计算得到的
colorVal赋值给箭头的填充色(fc)和边缘色(ec) - 将颜色条的创建代码移出循环,避免重复生成
内容的提问来源于stack exchange,提问作者Wiz123
相关产品推荐
相关产品推荐

