我有一个 5 列和一些行数的二维数组。不同的列有以下条目x1 y1 x2 y2 z
我想绘制一个从 (x1,y1) 到 (x2,y2) 的箭头,并且箭头的颜色应该取自与一些内置颜色图相对应的 z 列。我该怎么做这个 matplotlib/python?
问问题
21350 次
1 回答
15
你可以这样做:
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
值转换为参数以传递给命令的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()
注意事项:
- 额外
import matplotlib as mpl
的可以访问ColorbarBase
- 现在,明确需要指定两个轴,一个用于箭头,一个用于颜色条。第二组轴应该有一个合理的颜色条大小。
该add_axes
命令以[left, botton, width, height]
相对单位作为输入。所以右边由 给出left + width
。 - 在第一组轴上绘制箭头,即
ax
您的初始图形。 - 在第二组轴上绘制 colobar,
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)
于 2013-09-11T18:46:18.827 回答