如何从scatter_matrix获取数据数组

时间:2017-12-25 10:23:58

标签: python pandas matplotlib

我正在使用scatter_matrix的{​​{1}},我想知道如何在每个散射矩阵上绘制2D数组?另外,如何识别输出图中哪个pandas输出是哪个矩阵?

1 个答案:

答案 0 :(得分:1)

scatter_matrix是来自pandas子模块的pandas.plotting的便利函数。虽然the documentation is scarce(以及docstring只是更有帮助),但该示例使得理解其工作方式非常简单。请考虑文档中的示例:

import numpy as np # only needed for the example input
import pandas as pd
from pandas.plotting import scatter_matrix

df = pd.DataFrame(np.random.randn(1000, 4), columns=['a', 'b', 'c', 'd'])
axs = scatter_matrix(df, alpha=0.2, figsize=(6,6), diagonal='kde')
axs[0,0].get_figure().show() # or import and call matplotlib.pyplot.show

example scatter_matrix output

请注意底部和左侧轴上的标签:这些标签指示输入数据框的哪些列在给定的行/列中相互绘制。在图的第一列中,x轴对应于df.a,在第二行图中,y轴对应于df.b等(并且在对角线中绘制各列的密度或直方图) )。因此,绘图矩阵中的转置元素对应于x和y数据的交换,即绘图相对于x = y线的反射。如果你仔细看看上图,你会发现确实如此。

换句话说,您无需计算各个轴的数据,因为您可以直接控制输入数据。在非对角轴axs[i,j]中,x数据由df[df.columns[j]]给出,y数据由df[df.columns[i]]给出。这是一个帮助可视化订单的快速方法:

axs = scatter_matrix(df, alpha=0.2, figsize=(6,6), diagonal='kde')
for i in range(axs.shape[0]):
    for j in range(axs.shape[1]):
        if i == j:
            continue
        axs[i,j].set_title('x: {}, y: {}'.format(df.columns[j],df.columns[i]),
                           position=(0.5,0.5))

example scatter_matrix output with annotations showing the x and y sources for each off-diagonal plot

因此,虽然可以深入挖掘每个AxesSubplot对象的内脏并从中提取数据,但直接使用df的相应列更加简单。对角线是一个例外:在内核密度图的情况下(假设diagonal='kde'关键字已传递给scatter_matrix),您无法直接访问基础数据。在这种情况下,您可以从对角线AxesSubplots

中提取线条
import matplotlib.pyplot as plt
index = 0
xdat,ydat = axs[index,index].get_lines()[0].get_data() # example for diagonal [0,0]
plt.figure()
plt.plot(xdat,ydat,'-')
plt.xlabel(df.columns[index])
plt.ylabel('density')