R '对'的matplotlib模拟

3hvapo4f  于 2023-02-16  发布在  其他
关注(0)|答案(7)|浏览(119)

R有一个很有用的函数pairs,它提供了数据集中变量之间成对连接图的良好矩阵,生成的图类似于下图,复制自this blog post

有没有基于python matplolib的现成函数?我搜索了它的gallery,但是找不到任何类似我需要的东西。从技术上讲,这应该是一个简单的任务,但是正确处理所有可能的大小写、标签、标题等是非常乏味的。

更新见下面我的答案与快速和肮脏的近似。

xriantvc

xriantvc1#

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')

然而,它是特定于pandas的(但可以用作起点)。
Pandas中还有一些类似R的情节。看看docs

vhmi4jdf

vhmi4jdf2#

快速而肮脏地接近我的需求:

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

上述代码特此发布到公共领域

jchrr9hc

jchrr9hc3#

matplotlib最新版本(至少1.4)中的subplots函数使这一点变得更容易:

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)
pgccezyw

pgccezyw4#

在最近的版本中(0.23.3之后或更早的版本),您可以用途:

In [80]: from pandas.plotting import scatter_matrix

In [81]: df = pd.DataFrame(np.random.randn(1000, 4), columns=['a', 'b', 'c', 'd'])

In [82]: scatter_matrix(df, alpha=0.2, figsize=(6, 6), diagonal='kde')

可以采用类似于kdehist的值。

pkwftd7m

pkwftd7m5#

你可以使用seaborn pairplot(...) function,它很像R中的pairs(...)函数。

eufgjt7s

eufgjt7s6#

据我所知,还没有那种现成的功能。

gupuwyp2

gupuwyp27#

从一个帖子,我得到这个:

from scipy.stats import pearsonr
def reg_coef(x,y,label=None,color=None, **kwargs):
    ax = plt.gca()
    r,p = pearsonr(x,y)
    if p < 0.01:
        sig_level = '***'
    elif p < 0.05:
        sig_level = '**'
    elif p < 0.05:
        sig_level = '*'
    else:
        sig_level = ''
        
    ax.annotate('r = {:.2f} {}'.format(r, sig_level), xy=(0.5,0.5), xycoords='axes fraction', ha='center')
    ax.texts[0].set_size(16)
    ax.set_axis_off()

# Create the plot
g = sns.PairGrid(data=X1, vars=columns, hue=None)
g.map_upper(reg_coef)
g = g.map_lower(sns.regplot, scatter_kws={"edgecolor": "white"})
g = g.map_diag(sns.histplot, kde=True)
plt.show()

enter image description here

相关问题