matplotlib Axes类-以给定单位显式设置轴的大小(宽度/高度)

yquaqz18  于 2023-08-06  发布在  其他
关注(0)|答案(4)|浏览(198)

我想使用matplotlib创建一个图形,在这里我可以显式地指定轴的大小,即我想设置轴边框的宽度和高度。
我已经找遍了所有地方,我找不到解决这个问题的办法。我通常会发现如何调整整个图形(包括刻度和标注)的大小,例如使用fig, ax = plt.subplots(figsize=(w, h))
这对我来说非常重要,因为我希望轴的比例为1:1,即纸上的1个单位等于现实中的1个单位。例如,如果xrange为0到10,主刻度= 1,x轴为10厘米,则1个主刻度= 1厘米。我将把这个图保存为pdf格式导入到一个乳胶文档中。
This question提出了一个类似的主题,但答案并不能解决我的问题(使用plt.gca().set_aspect('equal', adjustable='box')代码)
从另一个question中,我看到可以得到轴的大小,但不能明确地修改它们。
任何想法,我可以设置轴框的大小,而不仅仅是图的大小。图形尺寸应与轴线尺寸相适应。
谢谢你,谢谢
对于那些熟悉pgfplots的人来说,它会喜欢有一些类似于scale only axis的选项(例如,请参见here)。

ftf50wuq

ftf50wuq1#

坐标轴大小由图形大小和图形间距决定,可以使用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()

字符串

iqih9akk

iqih9akk2#

Matplotlib似乎有一些帮助类,允许您定义具有固定大小Demo fixed size axes的轴

i7uaboj4

i7uaboj43#

我发现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)

字符串
值得注意的事情:

  • 在axis示例上调用set_axes_locator()后,将中断tight_layout()函数。
  • 您选择的原始地物大小将是无关的,最终地物大小由您选择的轴大小和标签/记号标签/向外记号的大小决定。
  • 这种方法不适用于颜色比例尺。
  • 这是我第一次写stack overflow。
tyg4sfes

tyg4sfes4#

使用图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')

字符串
结果:


的数据

相关问题