我有一个二维数组,有5列和一些行数.不同的列具有以下条目x1 y1 x2 y2 z
我想要绘制从(x1,y1)到(x2,y2)的箭头,并且箭头的颜色应该从对应于一些内置色彩映射的z列中获取.我该怎么做matplotlib/python?
Sch*_*sch 12
你可以这样做:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as colors
import matplotlib.cm as cmx
DATA = np.random.rand(5,5)
cmap = plt.cm.jet
cNorm = colors.Normalize(vmin=np.min(DATA[:,4]), vmax=np.max(DATA[:,4]))
scalarMap = cmx.ScalarMappable(norm=cNorm,cmap=cmap)
for idx in range(0,len(DATA[:,1])):
colorVal = scalarMap.to_rgba(DATA[idx,4])
plt.arrow(DATA[idx,0], #x1
DATA[idx,1], # y1
DATA[idx,2]-DATA[idx,0], # x2 - x1
DATA[idx,3]-DATA[idx,1], # y2 - y1
color=colorVal)
plt.show()
Run Code Online (Sandbox Code Playgroud)
您希望用于scalarMap.to_rgba将z值转换为参数以传递给命令color选项arrow.
你的结果应该是这样的:

编辑
如果你想看到颜色条,事情也有点棘手.这是一个更新的最小例子:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as colors
import matplotlib.cm as cmx
import matplotlib as mpl
DATA = np.random.rand(5,5)
cmap = plt.cm.jet
cNorm = colors.Normalize(vmin=np.min(DATA[:,4]), vmax=np.max(DATA[:,4]))
scalarMap = cmx.ScalarMappable(norm=cNorm,cmap=cmap)
fig = plt.figure()
ax = fig.add_axes([0.1, 0.1, 0.7, 0.85]) # [left, bottom, width, height]
axc = fig.add_axes([0.85, 0.10, 0.05, 0.85])
for idx in range(0,len(DATA[:,1])):
colorVal = scalarMap.to_rgba(DATA[idx,4])
ax.arrow(DATA[idx,0], # x1
DATA[idx,1], # y1
DATA[idx,2]-DATA[idx,0], # x2 - x1
DATA[idx,3]-DATA[idx,1], # y2 - y1
color=colorVal)
cb1 = mpl.colorbar.ColorbarBase(axc, cmap=cmap,
norm=cNorm,orientation='vertical')
plt.show()
Run Code Online (Sandbox Code Playgroud)
注意事项:
import matplotlib as mpl访问权限ColorbarBase add_axes命令将[left, botton, width, height]相对单位作为输入.所以右边是给出的left + width. ax您的初始数字. axc.传递cmap,规范化cNorm和方向作为参数. 你的数字应该是这样的:

编辑2
如果您想在箭头上使用不同的彩色边缘,请更改color为facecolor(或fc)并指定edgecolor(ec).此外,您现在可能想要控制箭头的宽度(默认值=0.001)和头部的宽度(默认值=3x width).
plt.arrow(DATA[idx,0], #x1
DATA[idx,1], # y1
DATA[idx,2]-DATA[idx,0], # x2 - x1
DATA[idx,3]-DATA[idx,1], # y2 - y1
facecolor=colorVal,
edgecolor='k',
width=0.005,
head_width=0.01)
Run Code Online (Sandbox Code Playgroud)