Подтвердить что ты не робот

Matplotlib аналог R `пар`

R имеет полезную функцию pairs, которая обеспечивает красивую матрицу графиков попарных соединений между переменными в наборе данных. Полученный сюжет похож на следующий рисунок, скопированный из этот пост в блоге:

pairs

Есть ли какая-нибудь готовая функция, основанная на python matplolib? Я искал gallery, но не смог найти ничего похожего на то, что мне нужно. Технически это должно быть простой задачей, но правильная обработка всех возможных случаев, ярлыков, заголовков и т.д. Очень утомительна.

ОБНОВЛЕНИЕ см. ниже мой ответ с быстрым и грязным приближением.

4b9b3361

Ответ 1

Pandas имеет встроенную функцию scatter_matrix (исходный код), что является чем-то вроде это.

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

df = pd.DataFrame(np.random.randn(1000, 4), columns=['A','B','C','D'])
axes = pd.tools.plotting.scatter_matrix(df, alpha=0.2)
plt.tight_layout()
plt.savefig('scatter_matrix.png')

scatter_matrix.png

Однако это Pandas конкретный (но может использоваться как отправная точка).

В pandas есть еще несколько R подобных графиков. Посмотрите docs.

Ответ 2

Быстрое и грязное приближение к моим потребностям:

def pair(data, labels=None):
    """ Generate something similar to R `pair` """

    nVariables = data.shape[1]
    if labels is None:
        labels = ['var%d'%i for i in range(nVariables)]
    fig = pl.figure()
    for i in range(nVariables):
        for j in range(nVariables):
            nSub = i * nVariables + j + 1
            ax = fig.add_subplot(nVariables, nVariables, nSub)
            if i == j:
                ax.hist(data[:,i])
                ax.set_title(labels[i])
            else:
                ax.plot(data[:,i], data[:,j], '.k')

    return fig

Вышеприведенный выше код публикуется в общедоступном домене

Ответ 3

Функция subplots в последних версиях matplotlib (не менее 1,4) делает это немного проще:

def pairs(data, names):
    "Quick&dirty scatterplot matrix"
    d = len(data)
    fig, axes = plt.subplots(nrows=d, ncols=d, sharex='col', sharey='row')
    for i in range(d):
        for j in range(d):
            ax = axes[i,j]
            if i == j:
                ax.text(0.5, 0.5, names[i], transform=ax.transAxes,
                        horizontalalignment='center', verticalalignment='center',
                        fontsize=16)
            else:
                ax.scatter(data[j], data[i], s=10)

Ответ 4

Насколько я знаю, нет такой готовой к использованию функции.