首先,重要的是我使用plt.scatter执行此操作,而不是迭代点(补丁),因为对于我的实际数据,我有大量的数据点。问题是如何使用plt.scatter解决这个问题并找到正确的标记大小。
通过这个小例子,我想实现以下目标:
我的策略: 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时,我得到了这个图像:
正如你所看到的那样,正方形不是正方形,并且没有完全填充从0,0到1,1等的正方形。如果你使用fig.show(),这将更清楚地看到。 / p>
这个近似的解决方案还可以,因为网格非常大,看起来很好,但我想知道如何才能完全解决这个问题。如何确保标记准确放置在它应该适合的方形内,从左下方的两个轴上填充0,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()
您可以更改轴刻度以表示您的数据单位,自定义色彩映射以使缺失数据具有透明正方形,将imshow作为子图显示在另一个图中等等。