轴类 - 以给定单位

时间:2017-07-07 11:47:29

标签: python matplotlib plot axis axes

我想使用matplotlib创建一个图形,我可以明确指定轴的大小,即我想设置轴bbox的宽度和高度。

我到处都看了,我找不到解决方法。我通常会发现如何调整整个图的大小(包括刻度和标签),例如使用fig, ax = plt.subplots(figsize=(w, h))

这对我来说非常重要,因为我希望轴的比例为1:1,即纸张中的1个单位实际上等于1个单位。例如,如果xrange为0到10,主刻度= 1且x轴为10cm,则1主刻度= 1cm。我将这个数字保存为pdf,将其导入乳胶文件。

This question提出了一个类似的主题,但答案并没有解决我的问题(使用plt.gca().set_aspect('equal', adjustable='box')代码)

从另一个question我看到有可能获得轴的大小,而不是如何明确地修改它们。

任何想法如何设置轴盒大小而不仅仅是图形大小。图形尺寸应适应轴尺寸。

谢谢!

对于那些熟悉乳胶中pgfplots的人,它希望有类似于scale only axis选项的内容(例如,请参阅here)。

4 个答案:

答案 0 :(得分:11)

轴尺寸由图形尺寸和图形间距决定,可以使用figure.subplots_adjust()设置。相反,这意味着您可以通过设置数字大小设置轴尺寸来计算图形间距:

import matplotlib.pyplot as plt

def set_size(w,h, ax=None):
    """ w, h: width, height in inches """
    if not ax: ax=plt.gca()
    l = ax.figure.subplotpars.left
    r = ax.figure.subplotpars.right
    t = ax.figure.subplotpars.top
    b = ax.figure.subplotpars.bottom
    figw = float(w)/(r-l)
    figh = float(h)/(t-b)
    ax.figure.set_size_inches(figw, figh)

fig, ax=plt.subplots()

ax.plot([1,3,2])

set_size(5,5)

plt.show()

答案 1 :(得分:2)

看起来Matplotlib具有帮助器类,可让您定义固定大小Demo fixed size axes的轴

答案 2 :(得分:1)

使用fig.add_axes的另一种方法非常准确。我也包括了1厘米的网格

import matplotlib.pyplot as plt
import matplotlib as mpl

# This example fits a4 paper with 5mm margin printers

# figure settings
figure_width = 28.7 # cm
figure_height = 20 # cm
left_right_magrin = 1 # cm
top_bottom_margin = 1 # cm

# Don't change
left   = left_right_magrin / figure_width # Percentage from height
bottom = top_bottom_margin / figure_height # Percentage from height
width  = 1 - left*2
height = 1 - bottom*2
cm2inch = 1/2.54 # inch per cm

# specifying the width and the height of the box in inches
fig = plt.figure(figsize=(figure_width*cm2inch,figure_height*cm2inch))
ax = fig.add_axes((left, bottom, width, height))

# limits settings (important)
plt.xlim(0, figure_width * width)
plt.ylim(0, figure_height * height)

# Ticks settings
ax.xaxis.set_major_locator(mpl.ticker.MultipleLocator(5))
ax.xaxis.set_minor_locator(mpl.ticker.MultipleLocator(1))
ax.yaxis.set_major_locator(mpl.ticker.MultipleLocator(5))
ax.yaxis.set_minor_locator(mpl.ticker.MultipleLocator(1))

# Grid settings
ax.grid(color="gray", which="both", linestyle=':', linewidth=0.5)

# your Plot (consider above limits)
ax.plot([1,2,3,5,6,7,8,9,10,12,13,14,15,17])

# save figure ( printing png file had better resolution, pdf was lighter and better on screen)
plt.show()
fig.savefig('A4_grid_cm.png', dpi=1000)
fig.savefig('tA4_grid_cm.pdf')

结果: enter image description here

答案 3 :(得分:0)

我发现,ImportanceofBeingErnests答案修改了图形大小以调整轴大小,与我用来生成可发布出版物的专用matplotlib设置的结果不一致。最终图形尺寸中存在一些错误,我无法找到用他的方法解决问题的方法。对于大多数用例,我认为这不是问题,但是在合并多个pdf进行发布时,这些错误很明显。

代替开发一个最小的工作示例来查找图形调整大小方法所遇到的实际问题,我反而找到了一种利用除法器类使用固定轴大小的方法。

from mpl_toolkits.axes_grid1 import Divider, Size
def fix_axes_size_incm(axew, axeh):
    axew = axew/2.54
    axeh = axeh/2.54

    #lets use the tight layout function to get a good padding size for our axes labels.
    fig = plt.gcf()
    ax = plt.gca()
    fig.tight_layout()
    #obtain the current ratio values for padding and fix size
    oldw, oldh = fig.get_size_inches()
    l = ax.figure.subplotpars.left
    r = ax.figure.subplotpars.right
    t = ax.figure.subplotpars.top
    b = ax.figure.subplotpars.bottom

    #work out what the new  ratio values for padding are, and the new fig size.
    neww = axew+oldw*(1-r+l)
    newh = axeh+oldh*(1-t+b)
    newr = r*oldw/neww
    newl = l*oldw/neww
    newt = t*oldh/newh
    newb = b*oldh/newh

    #right(top) padding, fixed axes size, left(bottom) pading
    hori = [Size.Scaled(newr), Size.Fixed(axew), Size.Scaled(newl)]
    vert = [Size.Scaled(newt), Size.Fixed(axeh), Size.Scaled(newb)]

    divider = Divider(fig, (0.0, 0.0, 1., 1.), hori, vert, aspect=False)
    # the width and height of the rectangle is ignored.

    ax.set_axes_locator(divider.new_locator(nx=1, ny=1))

    #we need to resize the figure now, as we have may have made our axes bigger than in.
    fig.set_size_inches(neww,newh)

值得注意的事情

  • 在轴实例上调用set_axes_locator()后,就会中断tight_layout()函数。
  • 您选择的原始图形尺寸将是无关紧要的,最终图形尺寸将由您选择的轴尺寸以及标签/刻度线标签/外刻度的尺寸决定。
  • 这种方法不适用于色标尺。
  • 这是我的第一个堆栈溢出帖子。