Настройка физически квадратных участков в Matplotlib 3 с общими осями - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь создать сюжет, аналогичный тому, что делает seaborn, но в родном matplotlib.

Я строю каждую серию в кадре данных против каждой другой серии в матрице графиков.

До сих пор я наносил на карту это, отмечал внешние оси и устанавливал оси, которые должны быть разделены вдоль столбцов и строк (так как это лучше всего работает с данными).

Последний шаг, который мне не удается сделать, - сделать все графики физически квадратными по размеру. Следующий код:

#scatter matrix

def plot_scatter_matrix(data):
    dim = len(data.columns.values)
    fig, axs = newfigure(dim, dim, sharex='col', sharey='row', figsize=(10,10))
    fig.tight_layout()
    for row, iname in enumerate(data.columns.values):
        for col, jname in enumerate(data.columns.values):
            axs[row,col].scatter(data[jname], data[iname])
            if col == 0:
                axs[row,col].set_ylabel(iname)
            if row == len(data.columns.values)-1:
                axs[row,col].set_xlabel(jname)

    return fig, axs

fig, axs = plot_scatter_matrix(ndata)
plt.show()

достигает этого (на фото только верхняя половина):

im1

Я попытался использовать axs[row,col].set_aspect(1.0, adjustable='box', share=True) после вызова scatter(), однако это просто привело к следующему:

im2

Как видите, некоторым удалось стать физически квадратными, но все они разных размеров.

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

1 Ответ

0 голосов
/ 10 января 2019

Если некоторые оси становятся квадратными с помощью set_aspect(1.0) (или эквивалентного set_aspect("equal")), это более или менее совпадение и произойдет только тогда, когда разность границ осей фактически равна; например когда диапазоны данных для x и y совпадают.

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

Требование к квадратным осям состоит в том, что аспект является частным от x- и y-диапазона.

ax.set_aspect(np.diff(ax.get_xlim())/np.diff(ax.get_ylim()))

См. Также: Как убедиться, что оси x и y имеют одинаковые размеры?

Другой вариант - ограничить пространство, которое имеют субплоты, с помощью параметров субплота, как показано в этом ответе - взаимодействие python между осью ('квадрат') и set_xlim .

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