Python 并排显示和绘图
我试图将并排的numpy数组显示为同一数组的image和seaborn distplot。我提出了以下函数: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,
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)
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)