matplotlib中类似R的`pairs`功能

38 投票
7 回答
17898 浏览
提问于 2025-04-15 21:52

R语言有一个很实用的函数叫做 pairs,它可以生成一个漂亮的图表,展示数据集中变量之间的成对关系。生成的图看起来像下面这个,从这个博客复制过来的:

pairs

有没有基于Python的matplotlib库可以直接使用的类似功能?我查过它的图库,但是没找到任何跟我需要的相似的东西。从技术上讲,这应该是个简单的任务,但处理所有可能的情况、标签、标题等等,真的很麻烦。

更新:请看我下面的回答,里面有一个快速且粗略的解决方案。

7 个回答

2

在最近版本的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)
3

这是一个快速且简单的方法,能满足我的需求:

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

上面的代码可以自由使用,没有任何版权限制。

49

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 的图表。可以看看 文档

撰写回答