【问题标题】:Plotting arrows with different color in matplotlib在 matplotlib 中绘制不同颜色的箭头
【发布时间】:2017-03-21 04:48:11
【问题描述】:

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

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    你可以这样做:

    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 上绘制colobar。传递cmap、标准化、cNorm 和方向作为参数。

    你的图应该是这样的:

    编辑 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)
    

    【讨论】:

    • 如果您能展示如何绘制颜色条以及它将会很有帮助,谢谢
    • 有没有办法在箭头周围放置 edgecolor?例如,除非有深色边缘,否则很难看到黄色。另外,白色箭头呢?
    猜你喜欢
    • 1970-01-01
    • 2013-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多