Выравнивание оси x с помощью sharex с использованием вспомогательных участков и цветовой шкалы с помощью matplotlib - PullRequest
0 голосов
/ 01 февраля 2019

Я пытаюсь создать набор вспомогательных участков с общей осью x, используя pyplot.Это все прекрасно, когда графики просты и все оси X выровнены нормально.Однако, когда я включаю подплот, который включает цветную полосу, это сжимает ширину этой конкретной подплоты, чтобы включить цветную полосу, в результате чего подплоты больше не разделяют ось X.

Я безуспешно искал в Интернете.Я пробовал несколько разных методов, но самый простой пример, который я приведу ниже.Я рисую одни и те же данные в каждом подзаговоре, но рисую один с помощью цветовой шкалы.Вы можете видеть, что данные больше не совпадают по оси X.

Заранее благодарим за помощь!


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

x = np.linspace(0, 10, num=100)
y = x ** 2 + 10 * np.random.randn(100)


f, (ax1, ax2) = plt.subplots(2,1,sharex=True,figsize=(8,12))

im1 = ax1.scatter(x, y, c=y, cmap='magma')
divider = make_axes_locatable(ax1)
cax = divider.append_axes("right", size="5%", pad=.05)

plt.colorbar(im1, cax=cax)

im2 = ax2.plot(x, y,'.')

plt.show()

Plot that I can't embed

Ответы [ 3 ]

0 голосов
/ 01 февраля 2019

Это один хакерский способ сделать это.

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

x = np.linspace(0, 10, num=100)
y = x ** 2 + 10 * np.random.randn(100)


f, (ax1, ax2) = plt.subplots(2,1,sharex=True,figsize=(8,12))

im1 = ax1.scatter(x, y, c=y, cmap='magma')
divider = make_axes_locatable(ax1)
cax = divider.append_axes("right", size="5%", pad=.05)

plt.colorbar(im1, cax=cax)

im2 = ax2.plot(x, y,'.')
divider2 = make_axes_locatable(ax2)
cax2 = divider2.append_axes("right", size="5%", pad=.05)
cax2.remove()
plt.show()

приводит к

enter image description here

0 голосов
/ 15 марта 2019
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 10, num=100)
y = x ** 2 + 10 * np.random.randn(100)

f, (ax1, ax2) = plt.subplots(2,1,sharex=True,figsize=(8,12),
        constrained_layout=True)
im1 = ax1.scatter(x, y, c=y, cmap='magma')
f.colorbar(im1, ax=ax1)
im2 = ax2.plot(x, y,'.')

enter image description here

0 голосов
/ 01 февраля 2019

Вы можете учесть необходимое с помощью цветовой шкалы уже при создании вспомогательных участков.Вместо использования делителя создайте четыре вспомогательных участка различной ширины, используя gridspec_kw.Затем вы можете удалить ненужные cax для второго подпункта:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 10, num=100)
y = x ** 2 + 10 * np.random.randn(100)



##creating four subplots with unequally divided widths:
f, axes = plt.subplots(
    2,2, sharex='col', figsize=(8,12),
    gridspec_kw = {'width_ratios' : (10,1)},
)
ax1,ax2 = axes[:,0]

##remove unneeded Axes instance:
axes[1,1].remove()

im1 = ax1.scatter(x, y, c=y, cmap='magma')
plt.colorbar(im1, cax=axes[0,1])

im2 = ax2.plot(x, y,'.')

f.savefig('sharex_colorbar.png')

Результат выглядит следующим образом:

result of the above code

В качестве альтернативы удалению ненужных экземпляров вспомогательных участков вы также можете сначала явно сгенерировать сеточную спецификацию и создать только необходимые вспомогательные участки.Это может быть более подходящим, если у вас есть много участков:

from matplotlib.gridspec import GridSpec
gs = GridSpec(nrows=2, ncols=2, width_ratios = (10,1))
f = plt.figure(figsize=(8,12))

ax1 = f.add_subplot(gs[0,0])
ax2 = f.add_subplot(gs[1,0],sharex=ax1)
cax = f.add_subplot(gs[0,1])

im1 = ax1.scatter(x, y, c=y, cmap='magma')
plt.colorbar(im1, cax=cax)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...