【问题标题】:Scatter plot marker size calculation散点图标记大小计算
【发布时间】:2018-02-01 00:13:01
【问题描述】:

我有一个非常具体的问题。我有两个 numpy 数组,每个数组的对应元素代表一个 2d 点。

a = [1,2,1,6,1]

b = [5,0,3,1,5]

我想绘制一个散点图,其中标记的大小取决于点出现的次数。

即:

1,5 : 2

2,0 : 1

1,3 : 1

6,1 : 1

所以size数组必须是size = [2,1,1,1],其他两个数组可以是

a = [1,2,1,6]b = [5,0,3,1]

所以我必须能够按如下方式调用plt.scatter

plt.scatter(a,b,s=size)

【问题讨论】:

    标签: python numpy matplotlib scatter-plot


    【解决方案1】:

    这会做你想做的事:

    from collections import Counter
    
    a = [1, 2, 1, 6, 1]
    b = [5, 0, 3, 1, 5]
    
    counts = Counter([(x, y) for x, y in zip(a, b)])
    
    size = [counts[(x, y)] for x, y in zip(a, b)]
    

    counter 将跟踪每个点在您的数组中出现的次数。然后 size 从counter 获取该数字。

    请注意,您实际上需要size = [2, 1, 1, 1, 2],因为您需要s 与输入数组的大小相同。不过这无关紧要;您只需将同一点绘制两次。

    如果您确实想删除重复项,您可以做同样的事情,但添加一个额外的步骤,在其中创建一个 set 的点。

    from collections import Counter
    
    a = [1, 2, 1, 6, 1]
    b = [5, 0, 3, 1, 5]
    
    counts = Counter([(x, y) for x, y in zip(a, b)])
    
    points = set([(x, y) for x, y in zip(a, b)])
    a = list()
    b = list()
    for x, y in points:
        a.append(x)
        b.append(y)
    
    size = [counts[(x, y)] for x, y in zip(a, b)]
    

    【讨论】:

      【解决方案2】:

      由于问题是用 numpy 标记的,我们可能会使用 numpy。 numpy.unique 允许计算数组唯一值的计数。

      import numpy as np
      
      a = [1,2,1,6,1]
      b = [5,0,3,1,5]
      
      u, c = np.unique(np.c_[a,b], return_counts=True, axis=0)
      

      然后

      # u=
      [[1 3]
       [1 5]
       [2 0]
       [6 1]]
      # c= 
      [1 2 1 1]
      

      这可以像这样绘制,其中可以使用附加函数将计数标准化为一些点大小以进行绘制

      import matplotlib.pyplot as plt
      s = lambda x : (((x-x.min())/float(x.max()-x.min())+1)*8)**2
      
      plt.scatter(u[:,0],u[:,1],s=s(c))
      
      plt.show()
      

      【讨论】:

      • 这确实解决了我的问题。但有一件事是当我在 python 2.7 中尝试时参数'axis'不起作用。为什么会这样?
      • 我自己使用的是python 2.7,所以这与python版本无关,而是与您使用的numpy版本有关。 axis 参数已添加到 numpy 版本 1.13.0。
      猜你喜欢
      • 2013-01-27
      • 1970-01-01
      • 2019-03-18
      • 1970-01-01
      • 2012-02-23
      • 1970-01-01
      • 1970-01-01
      • 2014-02-11
      相关资源
      最近更新 更多