在matplotlib中绘制不同颜色的箭头

时间:2013-09-11 18:11:05

标签: python matplotlib

我有一个包含5列和一些行数的二维数组。不同的列包含以下条目x1 y1 x2 y2 z 我想绘制从(x1,y1)到(x2,y2)的箭头,并且箭头的颜色应该从与某个内置色彩映射对应的z列中获取。 我该怎么做matplotlib / python?

1 个答案:

答案 0 :(得分: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()  

您希望使用scalarMap.to_rgbaz值转换为参数,以传递给color命令的arrow选项。
您的结果应如下所示:

enter image description here

修改
如果你想看到颜色条,事情也有点棘手。这是一个更新的最小例子:

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上绘制colobar。将cmap,规范化,cNorm和方向作为参数传递。

你的人物应该是这样的:

enter image description here

编辑2

如果您希望箭头上有不同颜色的边缘,请将color更改为facecolor(或fc)并指定edgecolorec)。此外,您现在可能想要控制箭头的宽度(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)