выравнивание осей разных участков в matplotlib - PullRequest
0 голосов
/ 03 мая 2018

Я пытаюсь выровнять эти графики так, чтобы ось x верхнего графика идеально совпала со значениями оси x в imshow. Я могу сделать это, установив аспект на авто, но затем мое изображение искажается. Есть ли способ сделать это?

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-10, 10, 1200)
y = np.linspace(-20, 20, 1600)
xv, yv = np.meshgrid(x, y)
w = 3
xpos = 0
ypos = 5
z = np.exp(-((xv - xpos)**2 + (yv - ypos)**2) / w**2)
xh = np.linspace(0, 2)
yh = np.sin(xh)

sumvertical = np.sum(z, 0)
xvert = range(np.shape(z)[1])

sumhoriz = np.sum(z, 1)
yhoriz = range(np.shape(z)[0])

# 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_x = [left, bottom_h, width, 0.2]
rect_y = [left_h, bottom, 0.2, height]

plt.figure(1, figsize=(8, 8))

axCenter = plt.axes(rect_scatter)
axhoriz = plt.axes(rect_x)
axvert = plt.axes(rect_y)

axCenter.imshow(z, origin='lower', cmap='jet') #aspect='auto')
axhoriz.plot(xvert, sumvertical)
axvert.plot(sumhoriz, yhoriz)

plt.show()

output

1 Ответ

0 голосов
/ 03 мая 2018

Я бы рекомендовал использовать инструменты из mpl_toolkits.axes_grid1, а именно make_axes_locatable, чтобы разделить центральные оси, чтобы оставить место для краевых осей.

Затем вы должны также установить margins в 0 в общем направлении, чтобы совпадать диапазоны.

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

x = np.linspace(-10, 10, 1200)
y = np.linspace(-20, 20, 1600)
xv, yv = np.meshgrid(x, y)
w = 3
xpos = 0
ypos = 5
z = np.exp(-((xv - xpos)**2 + (yv - ypos)**2) / w**2)
xh = np.linspace(0, 2)
yh = np.sin(xh)

sumvertical = np.sum(z, 0)
xvert = range(np.shape(z)[1])

sumhoriz = np.sum(z, 1)
yhoriz = range(np.shape(z)[0])


fig, axCenter = plt.subplots(figsize=(8, 8))
fig.subplots_adjust(.05,.1,.95,.95)

divider = make_axes_locatable(axCenter)
axvert = divider.append_axes('right', size='30%', pad=0.5)
axhoriz = divider.append_axes('top', size='20%', pad=0.25)

axCenter.imshow(z, origin='lower', cmap='jet')
axhoriz.plot(xvert, sumvertical)
axvert.plot(sumhoriz, yhoriz)

axhoriz.margins(x=0)
axvert.margins(y=0)

plt.show()

enter image description here

...