gpt4 book ai didi

python - 在 Matplotlib 中选择标记大小

转载 作者:太空狗 更新时间:2023-10-29 18:32:54 26 4
gpt4 key购买 nike

我正在像这样在 matplotlib 中用方形标记绘制散点图:

small_marker .

我想实现这样的目标:

enter image description here

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

最佳答案

我找到了两种解决方法:

第一个基于this answer .基本上,您确定相邻数据点之间的像素数并使用它来设置标记大小。 scatter 中的标记大小以面积形式给出。

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. 背后的逻辑。

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

这种方法使用patches而不是scatter,所以一定要包含

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')

关于 Rectangle 的评论:坐标是左下角,因此是 x-h/2。
这种方法给出了连接的矩形。如果我仔细查看此处的输出,它们似乎仍然重叠一个像素 - 同样,我不确定这是否有帮助。

关于python - 在 Matplotlib 中选择标记大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16819193/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com