Как поместить линии сетки от вторичной оси позади основного графика? - PullRequest
1 голос
/ 10 апреля 2019

Следующий скрипт создает экземпляр Figure с синей гистограммой за вторичными линиями сетки, которые сами находятся за оранжевой кумулятивной гистограммой.

import matplotlib.pyplot as plt
import numpy as np

plt.style.use("seaborn-darkgrid")
np.random.seed(42)

foo = np.random.randn(1000)

fig, ax = plt.subplots()
ax.hist(foo, bins=50)
ax2 = ax.twinx()
ax2.hist(
    foo, bins=50, density=True, cumulative=True, histtype="step", color="tab:orange"
)

plt.show()

Output of the code snippet

Я искал способ поместить линии сетки за синей гистограммой и обнаружил связанную проблему в matplotlib / matplotlib # 7984 . Это говорит

вы не можете чередовать порядок рисования художников из одного Оси с таковым из другого

и это объясняет, почему ax2.set_axisbelow(True) не влияет на основной Axes.

Могу ли я достичь своей цели каким-то образом? Обходные пути приветствуются (я полагаю, что по приведенной выше цитате канонического решения не существует).

1 Ответ

1 голос
/ 10 апреля 2019

Ваш желаемый порядок рисования (сначала самый задний)

  • сетка для осей
  • сетка для сдвоенных осей
  • график по осям
  • сюжет по двум осям

Однако это невозможно, как видно из комментария

вы не можете чередовать порядок рисования художников из одной оси с этимиот другого

Это означает, что вам нужно 4 оси вместо двух.

  • оси для сетки первичной шкалы y
  • оси для сетки вторичной шкалы y
  • оси для построения на первичной шкале y
  • оси дляграфик по вторичной шкале y

Это может выглядеть так:

import matplotlib.pyplot as plt
import numpy as np

np.random.seed(42)

foo = np.random.randn(1000)

fig, ax1a = plt.subplots()  # ax1a for the histogram grid
ax2a = ax1a.twinx()         # ax2a for the cumulative step grid
ax1b = ax1a.twinx()         # ax1b for the histogram plot
ax2b = ax1a.twinx()         # ax2a for the cumulative step plot
# Link the respective y-axes for grid and plot
ax1a.get_shared_y_axes().join(ax1a, ax1b)
ax2a.get_shared_y_axes().join(ax2a, ax2b)
# Remove ticks and labels and set which side to label
ticksoff = dict(labelleft=False, labelright=False, left=False, right=False)
ax1a.tick_params(axis="y", **ticksoff)
ax2a.tick_params(axis="y", **ticksoff)
ax1b.tick_params(axis="y", labelleft=True, labelright=False, left=True, right=False)
ax2b.tick_params(axis="y", labelleft=False, labelright=True, left=False, right=True)
# Spines off
for ax in [ax1a, ax2a, ax1b]:
    for k,v in ax.spines.items():
        v.set_visible(False)

ax1b.hist(foo, bins=50)

ax2b.hist(
    foo, bins=50, density=True, cumulative=True, histtype="step", color="tab:orange"
)
ax1a.grid()
ax2a.grid()
plt.show()

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...