gpt4 book ai didi

python - imshow 并排绘制

转载 作者:太空宇宙 更新时间:2023-11-03 14:53:00 26 4
gpt4 key购买 nike

我试图将并排的 numpy 数组显示为同一数组的图像和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()

产生: enter image description here

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

我想要以下图像和绘图的位置: enter image description here

最佳答案

有很多方法可以解决这个问题。以下所有内容都会给出或多或少相同的图像

enter image description here

A.减少可用空间

您可以减少可用空间,使两个图都限制在相同的垂直边距。这可以通过

来完成
  1. 降低人物高度

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

  2. 使用 subplots_adjust 限制边距

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

B.使用InsetPosition

您可以使用mpl_toolkits.axes_grid1.inset_locator.InsetPosition调整第二个轴的坐标以匹配第一个轴的坐标。

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_toolkits.axes_grid1.make_axes_locatable在它旁边创建一个新轴。

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。计算所需的纵横比

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)

ya = np.diff(np.array(ax2.get_ylim()))[0]
xa = np.diff(np.array(ax2.get_xlim()))[0]
wa = gkw['width_ratios'][0]/float(gkw['width_ratios'][1])
ia = arr.shape[0]/float(arr.shape[1])
ax2.set_aspect(float(wa*ia/(ya/xa)))

plt.show()

arr = np.random.randn(200,120)
visualize(arr)

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)

关于python - imshow 并排绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45782686/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com