Видимость для линий сетки Twinx - PullRequest
2 голосов
/ 27 марта 2019

При создании накладываемых гистограмм с двумя различными шкалами высоты с использованием Axes.twinx() я не могу установить видимые вертикальные линии сетки набора «двойная» ось. Горизонтальные линии работают нормально, хотя. Любые мысли о том, как решить эту проблему?

Ниже приведен пример кода, который иллюстрирует, что я хочу сделать, а что нет. Как видно, вертикальные линии сетки скрыты красными полосами ax2, тогда как я хочу, чтобы линии сетки были видны через все полосы.

# Create figure and figure layout
ax1 = plt.subplot()
ax2 = ax1.twinx()

# Example data
x = [0, 1, 2, 3, 4, 5]
h1 = [55, 63, 70, 84, 73, 93]
h2 = [4, 5, 4, 7, 4, 3]

# Plot bars
h1_bars = ax1.bar(x, h1, width=0.6, color='darkblue')
h2_bars = ax2.bar(x, h2, width=0.6, color='darkred')

# Set y limits and grid visibility
for ax, ylim in zip([ax1, ax2], [100, 10]):
    ax.set_ylim(0, ylim)
    ax.grid(True)

Ошибка возникает из-за того, что вертикальные линии сетки ax2 не установлены видимыми. Это можно проверить, установив ax1.grid(False), в этом случае имеются только горизонтальные линии сетки.

Я перепробовал все комбинации ax1.xaxis.grid(True), ax1.yaxis.grid(True), ax2.xaxis.grid(True) и ax2.yaxis.grid(True) без какой-либо удачи. Любая помощь в этом вопросе высоко ценится!

1 Ответ

2 голосов
/ 27 марта 2019

Вы можете изменить роль ax1 и ax2 так, чтобы синие столбцы были на ax2, а красные - на ax1. Затем вам нужно поместить двойные оси на задний план и отметить соответствующие оси y на другой стороне графика.

import matplotlib.pyplot as plt

# Create figure and figure layout
ax1 = plt.subplot()
ax2 = ax1.twinx()

# Example data
x = [0, 1, 2, 3, 4, 5]
h1 = [55, 63, 70, 84, 73, 93]
h2 = [4, 5, 4, 7, 4, 3]

# Plot bars
h1_bars = ax2.bar(x, h1, width=0.6, color='darkblue')
h2_bars = ax1.bar(x, h2, width=0.6, color='darkred')

# Set y limits and grid visibility
for ax, ylim in zip([ax1, ax2], [10, 100]):
    ax.set_ylim(0, ylim)
    ax.grid(True)


ax1.set_zorder(1)
ax1.patch.set_alpha(0)
ax2.set_zorder(0)

ax1.yaxis.tick_right()
ax2.yaxis.tick_left()

plt.show()

enter image description here

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