在matplotlib中指定图形大小的单位为厘米。

50

我想知道在matplotlib中是否可以以厘米为单位指定图形的大小。目前我的代码为:

def cm2inch(value):
    return value/2.54

fig = plt.figure(figsize=(cm2inch(12.8), cm2inch(9.6)))

但是否有本地方法?

5个回答

34

这不是对问题“有原生的方法吗?”的回答,但我认为有一种更优雅的方式:

def cm2inch(*tupl):
    inch = 2.54
    if isinstance(tupl[0], tuple):
        return tuple(i/inch for i in tupl[0])
    else:
        return tuple(i/inch for i in tupl)

那么可以使用plt.figure(figsize=cm2inch(12.8, 9.6))来创建图形,我认为这是一种更加简洁的方式。实现还允许我们使用 cm2inch((12.8, 9.6)),虽然个人不太喜欢,但有些人可能会使用。


尽管目前没有本地化解决此问题的方法,但我在此处找到了一个讨论 here


1
如果您不介意返回生成器并编写一行代码,或者 def cm2inch(*tupl): return (i/2.54 for i in tupl[0]) if type(tupl[0]) is tuple else (i/2.54 for i in tupl) - Ezbob

18
我已经向GitHub上的matplotlib存储库提交了一个拉取请求,以包括用于图形的set_size_cm和get_size_cm功能(https://github.com/matplotlib/matplotlib/pull/5104)。
如果被接受,这应该允许您使用一种以厘米为单位的本地方法来设置大小。

5
六年后,传奇故事继续。 - raphael

9

我认为这里提供的解决方案也很有帮助。所以,在您的情况下,

cm = 1/2.54  # centimeters in inches
plt.figure(figsize=(12.8*cm, 9.6*cm))

1
哎呀,抢先一步了。这个答案应该上去,因为它是由matplotlib指定的,并且无疑是最优雅的答案。 - undefined

1
据我所知,matplotlib没有任何转换函数。
如果您经常需要进行单位转换,可以考虑使用pint。它还提供NumPy支持。
对于您的示例,您可以执行以下操作:
from pint import UnitRegistry
ureg = UnitRegistry()

width_cm, height_cm = (12.8 * ureg.centimeter, 9.6 * ureg.centimeter)
width_inch, height_inch = (width_cm.to(ureg.inch), height_cm.to(ureg.inch))

figsize_inch = (width_inch.magnitude, height_inch.magnitude)
fig = plt.figure(figsize=figsize_inch)

0
也许你可以定义自己的图形方法。这并不是非常优雅,但它避免了一直指定厘米的麻烦。当然,这也可以适应其他典型的pyplot图形,比如plt.subplots等。
def figure(**kwargs):
    """
    create a figure with figsize in cm
    """
    cm = 1/2.56  # convert cm to inch

    kwargs = dict(**kwargs)
    figsize = kwargs.pop("figsize", (15*cm, 10*cm))
    figsize = (figsize[0]*cm, figsize[1]*cm)

    fig = plt.figure(figsize=figsize, **kwargs)
    return fig

figure(figsize=(12.8,9.6))

返回 图形(500x375)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接