Сюжеты Matplotlib слишком узкие с плотной планировкой - PullRequest
0 голосов
/ 06 июля 2018

В настоящее время я пытаюсь построить множество вспомогательных участков в Matplotlib (Python 3.6, Matplotlib 2.0.0), используя GridSpec. Вот минимальный рабочий пример:

import matplotlib.pyplot as plt
from matplotlib.gridspec import *

# Color vector for scatter plot points
preds = np.random.randint(2, size=100000)

# Setup the scatter plots
fig = plt.figure(figsize=(8,8))
grid = GridSpec(9, 9)

# Create the scatter plots
for ii in np.arange(0, 9):
    for jj in np.arange(0, 9):
        if (ii > jj):
            ax = fig.add_subplot(grid[ii, jj])
            x = np.random.rand(100000)*2000
            y = np.random.rand(100000)*2000
            ax.scatter(x, y, c=preds)

Это результат без изменений:

enter image description here

Конечно, интервал между участками неудовлетворителен, поэтому я сделал то, что обычно делаю, и использовал tight_layout(). Но, как видно на рисунке ниже, tight_layout() сжимает ширину графиков недопустимо:

Figure With Tight Layout

Вместо того, чтобы использовать tight_layout(), я решил, что нужно просто отрегулировать подзаговоры вручную, используя subplots_adjust(). Ниже приведена цифра с subplots_adjust(hspace=1.0, wspace=1.0).

Figure With Manually Adjusted Subplots

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

Есть ли лучший способ получить правильный интервал между вспомогательными участками, сохраняя при этом соотношение сторон и достаточно большой размер вспомогательных участков? Единственное возможное решение, которое я мог придумать, - это использовать subplots_adjust() с большим figsize, но это приводит к очень большому пространству между краями фигуры и вспомогательными участками.

Любые решения приветствуются.

1 Ответ

0 голосов
/ 06 июля 2018

Поскольку все ваши оси имеют одинаковые диапазоны x и y, я бы выбрал отображение меток только на внешней Axes. Для сетки с одинаковыми по размеру участками это легко автоматизировать с помощью ключевых слов sharex и sharey, равных plt.subplots(). Конечно, если вы настроите сетку из 9x9 вспомогательных участков, это даст вам больше графиков, чем вы хотите, но вы можете либо сделать лишние участки невидимыми (например, с помощью Axes.set_visible, либо удалить их полностью. В приведенном ниже примере я иду с последний.

from matplotlib import pyplot as plt
import numpy as np

fig, axes = plt.subplots(
    nrows=9, ncols=9, sharex=True, sharey=True, figsize = (8,8)
)

# Color vector for scatter plot points
preds = np.random.randint(2, size=1000)

# Create the scatter plots
for ii in np.arange(0, 9):
    for jj in np.arange(0, 9):
        if (ii > jj):
            ax = axes[ii,jj]
            x = np.random.rand(1000)*100
            y = np.random.rand(1000)*2000
            ax.scatter(x, y, c=preds)
        else:
            axes[ii,jj].remove() ##remove Axes from fig
            axes[ii,jj] = None   ##make sure that there are no 'dangling' references.    

plt.show()

Полученная фигура выглядит так:

result of the above code

Это, конечно, может быть скорректировано с помощью чего-то вроде subplots_adjust(). Надеюсь, это поможет.

...