【问题标题】:How to set the width of an AxesSubPlot?如何设置 AxesSubPlot 的宽度?
【发布时间】:2012-05-29 06:47:23
【问题描述】:

我有一个 640 点的数据集,但在子图中绘制它将轴缩放 到 700。如何将 x 轴设置为从 0 到 640 本身而不是缩放?

通常,如何将轴设置为任意度量?请解释设置轴的选项。


这是我正在使用的代码:

    self.figure = Figure()
    self.figure.set_size_inches( (15,3) )
    self.figure.set_dpi(80)

    self.picture = self.figure.add_subplot(211)
    #self.picture.xlim(xmax=640)
    self.intensity = self.figure.add_subplot(212)

self.picture.imshow(pic)
#... where projection happens to be 640 px wide
self.intensity.plot(projection)

【问题讨论】:

  • 您是在询问绘图的宽度(以像素为单位)(目前略小于 1200 像素)还是轴的 data 限制?您似乎是指数据限制,但是为什么要指以像素为单位的宽度? (它们彼此完全没有关系......)我很困惑......你只是在问如何关闭自动缩放?
  • 我的错,我的意思是点,而不是像素
  • @aitchnyu 您的问题还不是特别清楚,这就是为什么您没有得到很多回复的原因。您能否澄清一下,您希望您的子图为 640 pixels 宽还是您希望 x 轴的范围为 0 到 640?只说 640 分并没有多大帮助。
  • @Chris,我确实希望“x 轴范围从 0 到 640”并修改了我的问题。

标签: python matplotlib


【解决方案1】:

假设我正确理解了问题,您可以使用Axes.set_xlim() 函数。您的问题几乎是正确的,但是您对set_xlim 的调用并不完全正确,必须在您绘制数据之后:

import matplotlib.pyplot as plt

hf = plt.figure()
hf.set_size_inches( (15,3) )
hf.figure.set_dpi(80)

ha = hf.add_subplot(211)

pic = ...

ha.imshow(pic)

ha.set_xlim((0,640)) # This sets the x axis to range from 0 to 640.

如果您只想调整 x 轴的上限或下限,可以使用 Axes.set_xlimleftright 关键字参数。例如,将 x 轴的上限设置为 640,但将下限保留为您可以使用的任何值

ha.set_xlim(right=640)

这里需要注意两点:

  • 这些关键字参数不同于Axes.set_ylim,后者接受关键字参数bottomtop

  • 这也与matplotlib.pyplot.xlim不同,matplotlib.pyplot.xlim接受关键字参数xminxmax(这是@tsyu80实际上在谈论的函数),matplotlib.pyplot.ylim接受@987654336 @ 和ymax

【讨论】:

    【解决方案2】:

    首先要遵循一些设置代码:

    import numpy as np
    import matplotlib.pyplot as plt
    
    figure, (picture, intensity) = plt.subplots(nrows=2, figsize=(15, 3))
    figure.set_dpi(80)
    picture.imshow(np.random.uniform(size=(5, 50)))
    intensity.plot(np.random.random(size=641))
    

    注意对plt.subplots 的调用(末尾的s 很重要;没有s 有不同的功能)需要matplotlib 1.1 或更高版本。但是您的原始示例设置也可以。另请注意,轴被缩放到 700 而不是 640,因为 matplotlib 更愿意在 700 处绘制一个刻度,并且认为额外的空白并不是什么大问题。

    编辑: 我只是想指出figsize 参数、dpi 设置和picture 轴与原始问题无关,但我添加它们以匹配原始示例。

    正如克里斯提到的,你可以打电话

    intensity.set_xlim((0, 640))
    

    您可以改为传入关键字参数来仅调整所需的参数:

    intensity.set_xlim(right=640)
    

    如果您知道需要严格的坐标轴限制,但又不想手动设置,坐标轴对象可以根据已绘制的数据计算出来。

    intensity.autoscale(tight=True)
    

    或者如果您只想缩放x-轴:

    intensity.autoscale(axis='x', tight=True)
    

    注意autoscale 很特殊,因为如果您的数据限制发生变化(例如,如果您绘制另一个具有 680 个点的数据集),它将重新调整。

    或者,您可以使用margins 方法:

    intensity.margins(0)
    

    both xy 轴限制为数据限制并添加指定的填充---在本例中为 0。如果您真的想要在 @987654338 中添加一些间距@-direction 然后你可以写:

    intensity.margins(0, 0.1)
    

    增加的间距等于y 数据间隔的 10%。这些函数都做你想做的事,但它们不同的调用签名(和行为)在不同的情况下很有用。

    编辑:根据 Chris 的建议,将关键字参数固定为 set_xlim

    【讨论】:

    • intensity.set_xlim(xmax=640) 不正确。 Axes.set_xlim 的关键字参数是 leftright。函数matplotlib.pyplot.xlim 接受xminxmax 作为关键字参数,而matplotlib.axes.Axes.set_xlim 不接受。根据文档,关键字参数使用xminxmax,尽管它们没有提及更改时间。
    • @Chris 感谢您的更正。我已经在回复中解决了这个问题。
    • 感谢您的全面回答!
    猜你喜欢
    • 1970-01-01
    • 2021-10-08
    • 2011-04-16
    • 2012-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    • 1970-01-01
    相关资源
    最近更新 更多