我有一个二维数组,有5列和一定数量的行。不同的列有以下条目,我想绘制一个从(x1,y1)到(x2,y2)的箭头,箭头的颜色应该取自z列,对应于一些内置的色彩映射表。我该怎么做matplotlib/python?
发布于 2013-09-12 02:46:19
您可以这样做:
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()
您希望使用scalarMap.to_rgba
将z
值转换为参数,以传递给arrow
命令的color
选项。
您的结果应该如下所示:
编辑
如果你也想看到颜色条,那就有点麻烦了。下面是一个更新的最小示例:
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()
注意事项:
import matplotlib as mpl
现在,要访问ColorbarBase
add_axes
命令将以相对单位表示的[left, botton, width, height]
作为输入。所以右边是由left + width
给出的。
ax
上绘制箭头,这是您的初始图形。
axc
上绘制柱形图。将cmap
、规范化、cNorm
和方向作为参数传递。您的体形应该如下所示:
编辑2个
如果要在箭头上使用不同颜色的边,请将color
更改为facecolor
(或fc
)并指定edgecolor
(ec
)。此外,您现在可能希望控制箭头的宽度(default = 0.001
)和头部的宽度(default = 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)
https://stackoverflow.com/questions/18748328
复制相似问题