Python 并排显示和绘图

Python 并排显示和绘图,python,matplotlib,seaborn,Python,Matplotlib,Seaborn,我试图将并排的numpy数组显示为同一数组的image和seaborn distplot。我提出了以下函数: def visualize(arr): f, (ax1, ax2) = plt.subplots(1, 2, gridspec_kw = {'width_ratios': [1, 3]}) ax1.imshow(arr) flat = arr.flatten() x = flat[~np.isnan(flat)] sns.distplot(x,

我试图将并排的numpy数组显示为同一数组的image和seaborn distplot。我提出了以下函数:

def visualize(arr):
    f, (ax1, ax2) = plt.subplots(1, 2, gridspec_kw = {'width_ratios': [1, 3]})

    ax1.imshow(arr)

    flat = arr.flatten()
    x = flat[~np.isnan(flat)]
    sns.distplot(x, ax=ax2)
    plt.show()
产生:

如您所见,图像的高度小于绘图。如何修改我的函数以使绘图和imshow具有相同的高度

我想要图像和绘图的以下位置:
解决这个问题的方法有很多。以下所有内容都会给出大致相同的图像

A.减少可用空间 您可以减少可用空间,以便两个打印都约束到相同的垂直边距。这可以通过以下方式完成:

  • 降低体形高度

    fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(6,2.3), ...)
    

  • 使用
    子批次\u调整
    以限制边距

    fig.subplots_adjust(top=0.7, bottom=0.3)
    

  • B.使用
    InsetPosition
    您可以使用
    mpl\u工具箱、轴网格1、插入定位器、插入位置
    来调整第二个轴的坐标,使之与第一个轴的坐标相匹配

    import seaborn as sns
    import numpy as np
    import matplotlib.pyplot as plt
    from mpl_toolkits.axes_grid1.inset_locator import InsetPosition
    
    def visualize(arr):
        fig, (ax1, ax2) = plt.subplots(1, 2,
                                   gridspec_kw = {'width_ratios': [1, 3]})
    
        ax1.imshow(arr)
    
        flat = arr.flatten()
        x = flat[~np.isnan(flat)]
        sns.distplot(x, ax=ax2)
    
        ip = InsetPosition(ax1, [1.5,0,3,1]) 
        ax2.set_axes_locator(ip)
    
        plt.show()
    
    arr = np.random.randn(200,120)
    visualize(arr)
    
    C.使用轴分隔器 您可以仅为图像创建轴,然后使用
    mpl\u工具包。轴网格1。使轴可定位
    在其旁边创建新轴

    import seaborn as sns
    import numpy as np
    import matplotlib.pyplot as plt
    from mpl_toolkits.axes_grid1 import make_axes_locatable
    
    def visualize(arr):
        fig, ax = plt.subplots()
        divider = make_axes_locatable(ax)
        ax2 = divider.new_horizontal(size="300%", pad=0.5)
        fig.add_axes(ax2)
    
        ax.imshow(arr)
    
        flat = arr.flatten()
        x = flat[~np.isnan(flat)]
        sns.distplot(x, ax=ax2)
    
        plt.show()
    
    arr = np.random.randn(200,120)
    visualize(arr)
    
    D.计算所需的纵横比 E.动态复制位置 您可以获取左侧绘图的位置,并将其y坐标复制到右侧子绘图的位置。这是对现有代码的一个很好的附加组件。这一缺陷是必要的,因为后续对地物大小的更改需要重新计算位置

    import seaborn as sns
    import numpy as np
    import matplotlib.pyplot as plt
    
    def visualize(arr):
        gkw = {'width_ratios':[1, 3] }
        fig, (ax1, ax2) = plt.subplots(1, 2,  gridspec_kw = gkw )
    
        ax1.imshow(arr)
    
        flat = arr.flatten()
        x = flat[~np.isnan(flat)]
        sns.distplot(x, ax=ax2)
    
        def on_resize(evt=None):
            ax1.apply_aspect()
            bb1 = ax1.get_position()
            bb2 = ax2.get_position()
            bb2.y0 = bb1.y0; bb2.y1 = bb1.y1
            ax2.set_position(bb2)
    
        fig.canvas.mpl_connect("resize_event", on_resize)
        on_resize()
    
        plt.show()
    
    arr = np.random.randn(200,120)
    visualize(arr)
    

    在D中,为什么我们要通过长宽比
    x2
    ya/xa
    ?peer两个图的数据限制完全不同,因此您需要考虑它们。
    import seaborn as sns
    import numpy as np
    import matplotlib.pyplot as plt
    
    def visualize(arr):
        gkw = {'width_ratios':[1, 3] }
        fig, (ax1, ax2) = plt.subplots(1, 2,  gridspec_kw = gkw )
    
        ax1.imshow(arr)
    
        flat = arr.flatten()
        x = flat[~np.isnan(flat)]
        sns.distplot(x, ax=ax2)
    
        def on_resize(evt=None):
            ax1.apply_aspect()
            bb1 = ax1.get_position()
            bb2 = ax2.get_position()
            bb2.y0 = bb1.y0; bb2.y1 = bb1.y1
            ax2.set_position(bb2)
    
        fig.canvas.mpl_connect("resize_event", on_resize)
        on_resize()
    
        plt.show()
    
    arr = np.random.randn(200,120)
    visualize(arr)