【问题标题】:Finding the right marker size for a scatter plot为散点图找到正确的标记大小
【发布时间】:2014-02-11 07:31:22
【问题描述】:

我想绘制一个网格,其中网格中的每个节点都由一个点绘制,具有特定的颜色代码(取自存储在节点中的向量)。

这里的网格大小取决于我正在运行的模拟的大小。我还没有弄清楚画布大小和标记大小之间的关系。现在我使用以下公式:

markersize = (figsize*figsize*dpi*dpi)/(xdim*ydim)
plt.scatter(X, Y, s=markersize/3, marker='s', c=Z, cmap=cm.rainbow)
plt.show()

也就是说,我将 sigsize 和 dpi 平方(分别使用 15 和 80),然后除以网格的维度。最后,我将其除以 3,因为我发现它可以工作。

但我无法弄清楚如何通过分析获得正确的标记大小。我想要的是一个网格,其中每个正方形尽可能多地使用空间,但在其他节点的空间上没有“侵权”,以便标记重叠。

据我所知,figsize 以英寸为单位。 dpi 是 - 每英寸点数,标记大小以 - 点数指定。如果这些点与点相同,那么您将在每个轴上拥有 dpifigsize 数量的点。 xdimydim 是我的网格中的节点数量。然后划分 pow(dpifigsize, 2) / xdimydim 应该给出每个节点的点数,以及我认为的每个标记的正确大小。但这使得标记太大了。我跳水了 3 倍,它几乎适用于我通常运行的尺码,但并非适用于所有尺码。 (我猜一个点和一个点是不一样的,但是有什么关系呢?)

我该如何计算出正确答案?理想情况下,我想要一张非常精细的图片,我可以在其中放大某些区域以更精细地查看颜色细微差别。

【问题讨论】:

  • 如果你有一个 fig_size_x=fig_size_y 的各向同性数据,你可以这样做:marker_size = fig_x*fig_dpi/xdim. ax.scatter(x, y, z, marker='s',c=areaImg[x,y,z], s=marker_size, zdir='z', cmap=plt.cm.rainbow)。然后要获得清晰的结构,您可以使用interpolation

标签: python matplotlib data-visualization


【解决方案1】:

如果您想精确控制标记大小并使其与图形一起缩放,您可以使用patch 代替常规标记。这是一个例子:

from matplotlib import pyplot as plt
from matplotlib.patches import Circle

x = [1, 2, 3, 4, 5]
y = [1, 3, 1, 2, 4]
colors = [10, 215, 30, 100]

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

for (x, y, c) in zip(x, y, colors):
    ax.add_artist(Circle(xy=(x, y), radius=0.5, color=cmap(c)))      

ax.set_xlim(0, 6)
ax.set_ylim(0, 6)
plt.show()

您也可以使用矩形代替圆形。

【讨论】:

  • 感谢您的建议。但我认为迭代所有这些点对我来说太慢了。有什么方法可以精确计算散点图的标记大小?
猜你喜欢
  • 2013-01-27
  • 2018-02-01
  • 1970-01-01
  • 2019-03-18
  • 1970-01-01
  • 1970-01-01
  • 2012-02-23
  • 1970-01-01
相关资源
最近更新 更多