Python 中的子图大小

3 投票
1 回答
4939 浏览
提问于 2025-04-17 10:39

我现在遇到的问题如图所示

就是左下角的Y轴范围太大了,从-100到+600。有没有办法修改这个?我试了很多方法,但都没找到。

    # the random data
    x = np.random.randint(0,500,100000)
    y = np.random.randn(100000)



    fig = plt.figure(1, figsize=(5.5,5.5))

    from mpl_toolkits.axes_grid1 import make_axes_locatable

    # the scatter plot:
    axScatter = plt.subplot(111)
    axScatter.scatter(x, y)
    axScatter.set_aspect(1.)
    # create new axes on the right and on the top of the current axes
    # The first argument of the new_vertical(new_horizontal) method is
    # the height (width) of the axes to be created in inches.
    divider = make_axes_locatable(axScatter)
    axHistx = divider.append_axes("top", 1.2, pad=0.1, sharex=axScatter)
    axHisty = divider.append_axes("right", 1.2, pad=0.1, sharey=axScatter)

    # make some labels invisible
    plt.setp(axHistx.get_xticklabels() + axHisty.get_yticklabels(),
             visible=False)

    # now determine nice limits by hand:
    binwidth = 0.25
    print np.max(np.fabs(y))
    print np.max(np.fabs(x))

    xymax = np.max( [np.max(np.fabs(x)), np.max(np.fabs(y))] )

    print xymax #will always be gene length wich should not be

    lim = ( int(xymax/binwidth) + 1) * binwidth
    print lim
    bins = np.arange(0, lim + binwidth, binwidth)
    print bins

    #two histo grams, should stay of this?
    axHistx.hist(x, bins=bins)
    axHisty.hist(y, bins=bins, orientation='horizontal')

    # the xaxis of axHistx and yaxis of axHisty are shared with axScatter,
    # thus there is no need to manually adjust the xlim and ylim of these
    # axis.

    #axHistx.axis["bottom"].major_ticklabels.set_visible(False)
    for tl in axHistx.get_xticklabels():
        tl.set_visible(False)
    axHistx.set_yticks([0, 50, 100,200])

    #axHisty.axis["left"].major_ticklabels.set_visible(False)
    for tl in axHisty.get_yticklabels():
        tl.set_visible(False)
    axHisty.set_xticks([0, 50000, 100000])

    plt.draw()
    plt.show()
    plt.savefig('.png')

现在我可以使用:axScatter.set_ylim(-5, 5)来缩小坐标轴,但这样就出现了这个情况:

squased

这是个重发,因为之前的评论不知道怎么就全没了……

1 个回答

6

下面是一个替代方案,它结合了你的代码和来自 matplotlib 示例 的代码。我觉得你可以从这个点开始,计算我手动计算过的限制值:

在这里输入图片描述

from matplotlib import pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable
import numpy as np

x = np.random.randint(0, 500, 100000)
y = np.random.randn(100000)

# definitions for the axes
left, width = 0.1, 0.65
bottom, height = 0.1, 0.65
bottom_h = left_h = left + width + 0.02

rect_scatter = [left, bottom, width, height]
rect_histx = [left, bottom_h, width, 0.2]
rect_histy = [left_h, bottom, 0.2, height]

fig = plt.figure(1, figsize=(5.5,5.5))

axScatter = plt.axes(rect_scatter)
axHistx = plt.axes(rect_histx)
axHisty = plt.axes(rect_histy)

# the scatter plot:
axScatter.scatter(x, y)

binwidth = 0.25
xymax = np.max( [np.max(np.fabs(x)), np.max(np.fabs(y))] )
lim = ( int(xymax/binwidth) + 1) * binwidth

axScatter.set_xlim((0, lim))
axScatter.set_ylim((-5, 10))       # <-- controls y axis. Values should be calculated.

bins = np.arange(-lim, lim + binwidth, binwidth)
axHistx.hist(x, bins=bins)
axHisty.hist(y, bins=bins, orientation='horizontal')

axHistx.set_xlim(axScatter.get_xlim())
axHisty.set_ylim(axScatter.get_ylim())

#axHistx.axis["bottom"].major_ticklabels.set_visible(False)
for tl in axHistx.get_xticklabels():
    tl.set_visible(False)
axHistx.set_yticks([0, 50, 200])

#axHisty.axis["left"].major_ticklabels.set_visible(False)
for tl in axHisty.get_yticklabels():
    tl.set_visible(False)
axHisty.set_xticks([0, 10000, 20000])

plt.show()

撰写回答