Matplotlib аналог R `пар`
R имеет полезную функцию pairs
, которая обеспечивает красивую матрицу графиков попарных соединений между переменными в наборе данных. Полученный сюжет похож на следующий рисунок, скопированный из этот пост в блоге:
![pairs]()
Есть ли какая-нибудь готовая функция, основанная на python matplolib? Я искал gallery, но не смог найти ничего похожего на то, что мне нужно. Технически это должно быть простой задачей, но правильная обработка всех возможных случаев, ярлыков, заголовков и т.д. Очень утомительна.
ОБНОВЛЕНИЕ см. ниже мой ответ с быстрым и грязным приближением.
Ответы
Ответ 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
Насколько я знаю, нет такой готовой к использованию функции.