首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在matplotlib中绘制不同颜色的箭头

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

Stack Overflow用户
提问于 2013-09-12 02:11:05
回答 1查看 20.7K关注 0票数 9

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-12 02:46:19

您可以这样做:

代码语言:javascript
运行
复制
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值转换为参数,以传递给arrow命令的color选项。

您的结果应该如下所示:

编辑

如果你也想看到颜色条,那就有点麻烦了。下面是一个更新的最小示例:

代码语言:javascript
运行
复制
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() 

注意事项:

  • additional 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)。

代码语言:javascript
运行
复制
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)
票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18748328

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档