如何使用matplotlib将标记正方形与精确的正方形相比较?

时间:2015-03-06 18:24:58

标签: python matplotlib

首先,重要的是我使用plt.scatter执行此操作,而不是迭代点(补丁),因为对于我的实际数据,我有大量的数据点。问题是如何使用plt.scatter解决这个问题并找到正确的标记大小。

通过这个小例子,我想实现以下目标:

  1. 对于我的16个数据点中的每一个,图片上的一个方格应以特定于此点的颜色绘制。
  2. 根据figsize,我需要计算出标记所需的确切数据点数。
  3. 我的策略:  a)使用ax.transData.transform获取0,0,0,1,0,2的像素值    以及1,0,2,0,3,0来验证距离是否相等。  b)将宽度乘以高度以获得我需要的标记的大小。  c)从像素转换为点。  d)将此标记输入plt.scatter。

    import numpy as np
    import matplotlib.pyplot as plt
    
    xdim = 4
    figs = 5
    dpi = 100
    
    fig = plt.figure(num=None, figsize=(figs, figs), dpi=dpi, facecolor='w', edgecolor='k')
    plt.xlim((-1,5))
    plt.ylim((-1,5))
    
    ax = fig.add_subplot(111)
    x = np.arange(0+.5, xdim+.5, 1)
    y = np.arange(0+.5, xdim+.5, 1)
    
    X, Y = np.meshgrid(x, y)
    
    Z= np.random.rand(xdim*xdim,3)
    
    x_diff = np.diff(ax.transData.transform([(0,0),(0,1),(0,2),(0,3),(0,4)]),axis=0)
    y_diff = np.diff(ax.transData.transform([(0,0),(1,0),(2,0),(3,0),(4,0)]),axis=0)
    
    print(x_diff,y_diff)
    
    x_avg = np.average(x_diff[0,1])
    y_avg = np.average(y_diff[1,0])
    
    print(x_avg,y_avg)
    
    marker_pixels = x_avg*y_avg
    marker_points = (marker_pixels*72)/dpi
    
    print marker_points
    
    plt.scatter(X,Y,c=Z, s=marker_points, marker='s', edgecolors=None)
    
    plt.savefig('foo.png', dpi=dpi)
    

    然而,我得到的结果是66.666(事实!)和64.58在这个例子中,即不是正方形。当我将两者相乘,转换并输入到plt.scatter时,我得到了这个图像: enter image description here

    正如你所看到的那样,正方形不是正方形,并且没有完全填充从0,0到1,1等的正方形。如果你使用fig.show(),这将更清楚地看到。 / p>

    这个近似的解决方案还可以,因为网格非常大,看起来很好,但我想知道如何才能完全解决这个问题。如何确保标记准确放置在它应该适合的方形内,从左下方的两个轴上填充0,1?

1 个答案:

答案 0 :(得分:1)

一般的答案可能是补丁,而不是标记方块,无论它有多慢。但是,使用您显示的示例的网格特性,可以采用更简单的方式,您仍然可以对其进行其他绘图:

import matplotlib.pyplot as plt
from matplotlib import cm
import numpy.random as nr
quilt = nr.random((4,4))


plt.imshow(quilt, interpolation='none', aspect='equal', cmap=cm.jet)
plt.scatter([1,2,3],[3,0,1])
plt.plot([0,1,1.4, 2.3, 3.5],[0,1,2,3,2])
plt.show()

enter image description here

您可以更改轴刻度以表示您的数据单位,自定义色彩映射以使缺失数据具有透明正方形,将imshow作为子图显示在另一个图中等等。