Как сбросить `sharex` или` sharey` с двух осей в Matplotlib - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть серия вспомогательных участков, и я хочу, чтобы они совместно использовали оси x и y на всех участках, кроме 2 (для каждой строки).

Я знаю, что можно создать все вспомогательные участкиотдельно, а затем добавьте функциональность sharex / sharey после .

Однако, это большой код, учитывая, что я должен сделать это для большинства подзаговоров.

Более эффективным способом было бы создать все вспомогательные участки с желаемыми свойствами sharex / sharey, например:

import matplotlib.pyplot as plt

fix, axs = plt.subplots(2, 10, sharex='row', sharey='row', squeeze=False)

, а затем установить unset sharex / sharey функциональность, которая может гипотетически работать следующим образом:

axs[0, 9].sharex = False
axs[1, 9].sharey = False

Выше не работает, но есть ли способ получить это?

Ответы [ 3 ]

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

Вы можете получить доступ к группе общих осей, используя ax.get_shared_x_axes() или свойство ax._shared_y_axes.Затем вы можете сбросить видимость надписей, используя xaxis.set_tick_params(which='both', labelleft=True) или setp(ax, get_xticklabels(), visible=True), однако оба эти метода страдают одной и той же врожденной проблемой: средство форматирования тиков по-прежнему совместно используется осями.Насколько я знаю, нет никакого способа обойти это.Вот пример для демонстрации:

import matplotlib.pyplot as plt
import numpy as np

np.random.seed(1)
fig, axs = plt.subplots(2, 2, sharex='row', sharey='row', squeeze=False)
axs[0][0]._shared_x_axes.remove(axs[0][0])
axs[0][0]._shared_y_axes.remove(axs[0][0])

for ii in range(2):
    for jj in range(2):
        axs[ii][jj].plot(np.random.randn(100), np.linspace(0,ii+jj+1, 100))

axs[0][1].yaxis.set_tick_params(which='both', labelleft=True)
axs[0][1].set_yticks(np.linspace(0,2,7))
plt.show()

Unsetting shared axis

0 голосов
/ 28 июня 2019

Когда @zan указывает в их ответе , вы можете использовать ax.get_shared_x_axes(), чтобы получить Grouper объект, содержащий все связанные оси, а затем .remove любые оси из этого группировщика.Проблема (как указывает @WMiller) в том, что тикер остается одинаковым для всех осей.

Так что нужно будет

  1. удалить оси из группировщика
  2. установить новый тикер с соответствующим новым локатором и форматером

Полный пример

import matplotlib
import matplotlib.pyplot as plt
import numpy as np

fig, axes = plt.subplots(3, 4, sharex='row', sharey='row', squeeze=False)

data = np.random.rand(20, 2, 10)

for ax in axes.flatten()[:-1]:
    ax.plot(*np.random.randn(2,10), marker="o", ls="")



# Now remove axes[1,5] from the grouper for xaxis
axes[2,3].get_shared_x_axes().remove(axes[2,3])

# Create and assign new ticker
xticker = matplotlib.axis.Ticker()
axes[2,3].xaxis.major = xticker

# The new ticker needs new locator and formatters
xloc = matplotlib.ticker.AutoLocator()
xfmt = matplotlib.ticker.ScalarFormatter()

axes[2,3].xaxis.set_major_locator(xloc)
axes[2,3].xaxis.set_major_formatter(xfmt)

# Now plot to the "ungrouped" axes
axes[2,3].plot(np.random.randn(10)*100+100, np.linspace(-3,3,10), 
                marker="o", ls="", color="red")

plt.show()

enter image description here

Обратите внимание, что в приведенном выше примере я изменил тикер только для оси x, а также только для основных тиков.Вы должны сделать то же самое для оси y, а также для небольших тиков, если это необходимо.

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

Вы можете использовать ax.get_shared_x_axes(), чтобы получить объект Grouper, который содержит все связанные оси.Затем используйте group.remove(ax), чтобы удалить указанную ось из этой группы.Вы также можете group.join(ax1, ax2) добавить новую акцию.

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots(2, 10, sharex='row', sharey='row', squeeze=False)

data = np.random.rand(20, 2, 10)
for row in [0,1]:
    for col in range(10):
        n = col*(row+1)
        ax[row, col].plot(data[n,0], data[n,1], '.')

a19 = ax[1,9]

shax = a19.get_shared_x_axes()
shay = a19.get_shared_y_axes()
shax.remove(a19)
shay.remove(a19)

a19.clear()
d19 = data[-1] * 5
a19.plot(d19[0], d19[1], 'r.')

plt.show()

Для настройки тиков по-прежнему требуется небольшая настройка, но нижний правый график теперь имеет свои собственные ограничения.unshared axes

...