Python 在Matplotlib中选择标记大小

Python 在Matplotlib中选择标记大小,python,matplotlib,scatter-plot,Python,Matplotlib,Scatter Plot,我正在matplotlib中使用方形标记绘制散点图,如下所示: 我想实现这样的目标: 这意味着我必须调整标记大小和数字大小/比率,使标记之间没有空白。每个索引单元也应该有一个标记(x和y都是整数),所以如果y从60到100,y方向应该有40个标记。目前我正在手动调整它。你知道实现这一目标的最佳方法是什么吗?我找到了两种方法: 第一种是基于。基本上,您可以确定相邻数据点之间的像素数,并使用它来设置标记大小。散点中的标记大小作为区域给出 fig = plt.figure() ax = fig.a

我正在matplotlib中使用方形标记绘制散点图,如下所示:

我想实现这样的目标:


这意味着我必须调整标记大小和数字大小/比率,使标记之间没有空白。每个索引单元也应该有一个标记(x和y都是整数),所以如果y从60到100,y方向应该有40个标记。目前我正在手动调整它。你知道实现这一目标的最佳方法是什么吗?

我找到了两种方法:

第一种是基于。基本上,您可以确定相邻数据点之间的像素数,并使用它来设置标记大小。
散点
中的标记大小作为区域给出

fig = plt.figure()
ax = fig.add_subplot(111, aspect='equal')

# initialize a plot to determine the distance between the data points in pixel:    
x = [1, 2, 3, 4, 2, 3, 3]
y = [0, 0, 0, 0, 1, 1, 2]
s = 0.0
points = ax.scatter(x,y,s=s,marker='s')
ax.axis([min(x)-1., max(x)+1., min(y)-1., max(y)+1.])

# retrieve the pixel information:
xy_pixels = ax.transData.transform(np.vstack([x,y]).T)
xpix, ypix = xy_pixels.T

# In matplotlib, 0,0 is the lower left corner, whereas it's usually the upper 
# right for most image software, so we'll flip the y-coords
width, height = fig.canvas.get_width_height()
ypix = height - ypix

# this assumes that your data-points are equally spaced
s1 = xpix[1]-xpix[0]

points = ax.scatter(x,y,s=s1**2.,marker='s',edgecolors='none')
ax.axis([min(x)-1., max(x)+1., min(y)-1., max(y)+1.])

fig.savefig('test.png', dpi=fig.dpi)
第一种方法的缺点是符号重叠。我没能找到方法中的缺陷。我可以手动调整
s1

s1 = xpix[1]-xpix[0] - 13. 
以获得更好的结果,但我无法确定
13.
背后的逻辑

因此,第二种方法基于。在这里,在绘图上绘制各个正方形,并相应调整大小。在某种程度上,它是一个手动散点图(一个循环用于构建图形),因此根据数据集,它可能需要一段时间

这种方法使用
补丁
而不是
分散
,因此一定要包括

from matplotlib.patches import Rectangle  
同样,使用相同的数据点:

x = [1, 2, 3, 4, 2, 3, 3]
y = [0, 0, 0, 0, 1, 1, 2]
z = ['b', 'g', 'r', 'c', 'm', 'y', 'k'] # in your case, this is data
dx = [x[1]-x[0]]*len(x)   # assuming equally spaced data-points

# you can use the colormap like this in your case:
# cmap = plt.cm.hot 

fig = plt.figure()
ax = fig.add_subplot(111, aspect='equal')
ax.axis([min(x)-1., max(x)+1., min(y)-1., max(y)+1.])

for x, y, c, h in zip(x, y, z, dx):
    ax.add_artist(Rectangle(xy=(x-h/2., y-h/2.), 
                  color=c,             # or, in your case: color=cmap(c)                  
                  width=h, height=h))  # Gives a square of area h*h

fig.savefig('test.png')
矩形上有一条注释
:坐标位于左下角,因此
x-h/2。


这种方法给出了连通的矩形。如果我仔细观察这里的输出,它们似乎仍然重叠了一个像素——同样,我不确定这是否有帮助

改用
plt.imshow
plt.pcolor
!用
np.nan
填充空数据位置或使用屏蔽数组。colormap如何处理坏值由
set\u bad
@tcaswell控制,我没有空数据那么图形中没有标记的空格是什么?@DavidZwicker,使用plt.imshow或plt.color,我必须对数据进行转换(将其转换为2D形式)。我还可以在绘图中计算出图形/标记的大小,因此我不必更改代码。我只是找到了。在更具空间性的装箱下,还列出了另一个选项,@elyase