【问题标题】:Matplotlib: Non-random jitter [closed]Matplotlib:非随机抖动 [关闭]
【发布时间】:2015-11-27 20:48:08
【问题描述】:

我已经阅读了Matplotlib: avoiding overlapping datapoints in a "scatter/dot/beeswarm" plotAdding a scatter of points to a boxplot using matplotlib 的问题,但是我想生成类似这些用 R 生成的图:


(来源:eklund at www.cbs.dtu.dk

Here 是用于这些数字的代码。

我想用 matplotlib 来做,但到目前为止我只设法使用np.random.normal(i, 0.05)。这些点彼此分开,但我想让它们排序。

This answer 做的事情与我想要的类似,但我的数据是浮点数,它们非常接近但不同,因此 groupby 函数不起作用,我想让点对称于中心如上面使用 R 生成的图所示。

【问题讨论】:

    标签: python r matplotlib scatter-plot jitter


    【解决方案1】:

    正如这个问题Matplotlib: avoiding overlapping datapoints in a "scatter/dot/beeswarm" plot编辑中所指出的,我一开始并没有阅读,有一个用于这种情节的python包:

    https://github.com/mgymrek/pybeeswarm

    而且这个包肯定比下面的代码做得更好。

    我修改了this answer 的代码以接受浮点数,我得到的东西与我想要的有点相似。代码如下:

    CA = [0,4,0,3,0,5]  
    CB = [0,0,4,4,2,2,2,2,3,0,5] 
    CC = [0.08423, 4.0078, 0.02936, 0.04862, 3.2105, 3.7796, 1.9974, 1.6986, 1.7443, 1.6615, 1, 1, 1]
    
    lists = [CA, CB, CC]
    
    x = []
    y = []
    for index1, my_list in enumerate(lists):
        scores_bins = {}
        for index2, score in enumerate(my_list):
            binx = round(score, 1)
            if binx not in scores_bins:
                scores_bins[binx] = []
            scores_bins[binx].append(score)
    
        for key, val in sorted(scores_bins.items()):
            values = scores_bins[key]
            points = len(values)
            pos = 1 + index1 + (1 - points) / 50.
            for value in values:
                x.append(pos)
                y.append(value)
                pos += 0.05
    
    plt.plot(x, y, 'o')
    plt.xlim((0,4))
    plt.ylim((-1,6))
    
    plt.show()
    

    但是,如果 pos 增加,点会向右移动更多,而不是从中心向左右扩散...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-15
      • 1970-01-01
      • 1970-01-01
      • 2017-05-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多