matplotlib中的标记和图形大小:不确定它是如何工作的

时间:2015-11-10 21:40:30

标签: python-2.7 matplotlib

我想制作一个数字,标记的大小取决于数字的大小。这样,使用方形标记大小,无论您选择什么分辨率或图形大小,所有标记将相互接触,屏蔽背景而不重叠。我在这里:

标记大小在pt^2中指定,1pt=1/72inch,每英寸像素的分辨率,以像素为单位的数字大小(也是主要子图表在主要图形大小之外的比例: 0.8)。因此,如果我的图表限制为lim_minlim_max,我应该能够使用以下方式获取相应的标记大小:

marker_size=((fig_size*0.8*72/Resolution)/(lim_max-lim_min))**2

因为(fig_size*0.8*72/Resolution)是点数的大小,(lim_max-lim_min)是我想要填充一行的标记数。

这应该可以做到这一点!......它没有......根本......标记太小了,它们在没有变焦的情况下是不可见的。我不明白为什么。

我明白这不是最好的方式,也不是你做的方式,但我认为没有理由不这样做,所以我想知道我错在哪里。

PS:我的主要人物和我的子情节都是正方形

编辑:

好的,所以我找到了问题的原因,而不是解决方案。 ppidpi之间混淆的问题。 Matplotlib将分辨率设置为dpi,其定义为扫描仪或打印机特定的单位,具体取决于型号(?!?)。

毋庸置疑,我对matplotlib中分辨率的实际含义极为困惑。它对我来说绝对没有任何意义。请有人帮忙。我如何将其转换为有意义的单位?似乎matplotlib网站对此事完全保持沉默。

1 个答案:

答案 0 :(得分:2)

如果以英寸为单位指定图形尺寸,matplotlib使用每英寸72点(ppi)的分辨率,则对于给定数量的标记,每个标记的宽度应为size_in_inches * points_per_inch / number_of_markers点(现在假设子图使用整个图)?在我看来,dpi仅用于显示或保存大小为size_in_inches * dpi像素的数字。

如果我正确理解您的目标,下面的代码应该重现所需的行为:

# Figure settings
fig_size_inch = 3
fig_ppi = 72
margin = 0.12
subplot_fraction = 1 - 2*margin

# Plot settings
lim_max = 10
lim_min = 2
n_markers = lim_max-lim_min

# Centers of each marker
xy = np.arange(lim_min+0.5, lim_max, 1)

# Size of the marker, in points^2
marker_size = (subplot_fraction * fig_size_inch * fig_ppi / n_markers)**2 

fig = pl.figure(figsize=(fig_size_inch, fig_size_inch))
fig.subplots_adjust(margin, margin, 1-margin, 1-margin, 0, 0)

# Create n_markers^2 colors
cc = pl.cm.Paired(np.linspace(0,1,n_markers*n_markers))

# Plot each marker (I could/should have left out the loops...)
for i in range(n_markers):
    for j in range(n_markers):
        ij=i+j*n_markers
        pl.scatter(xy[i], xy[j], s=marker_size, marker='s', color=cc[ij])
pl.xlim(lim_min, lim_max)
pl.ylim(lim_min, lim_max)

这与你所写的(在marker_size的计算中)或多或少相同,除了Resolution的除法被遗漏了。

结果:

enter image description here

或者当设置fig_ppi错误地设置为60时:

enter image description here