在matplotlib中绘制相关图

Yuv*_*dam 13 python data-visualization graph matplotlib

假设我有一个离散向量数据集n=2:

DATA = [
    ('a', 4),
    ('b', 5),
    ('c', 5),
    ('d', 4),
    ('e', 2),
    ('f', 5),
]
Run Code Online (Sandbox Code Playgroud)

如何使用matplotlib绘制该数据集以便可视化两个变量之间的任何相关性?

任何简单的代码示例都会很棒.

Yan*_*ann 19

乔金顿有正确的答案,但你DATA可能表现得更复杂.它可能在'a'处有多个值.Joe构建x轴值的方式很快,但只适用于唯一值列表.可能有更快的方法来做到这一点,但这是我如何完成它:

import matplotlib.pyplot as plt

def assignIDs(list):
    '''Take a list of strings, and for each unique value assign a number.
    Returns a map for "unique-val"->id.
    '''
    sortedList = sorted(list)

    #taken from
    #http://stackoverflow.com/questions/480214/how-do-you-remove-duplicates-from-a-list-in-python-whilst-preserving-order/480227#480227
    seen = set()
    seen_add = seen.add
    uniqueList =  [ x for x in sortedList if x not in seen and not seen_add(x)]

    return  dict(zip(uniqueList,range(len(uniqueList))))

def plotData(inData,color):
    x,y = zip(*inData)

    xMap = assignIDs(x)
    xAsInts = [xMap[i] for i in x]


    plt.scatter(xAsInts,y,color=color)
    plt.xticks(xMap.values(),xMap.keys())


DATA = [
    ('a', 4),
    ('b', 5),
    ('c', 5),
    ('d', 4),
    ('e', 2),
    ('f', 5),
]


DATA2 = [
    ('a', 3),
    ('b', 4),
    ('c', 4),
    ('d', 3),
    ('e', 1),
    ('f', 4),
    ('a', 5),
    ('b', 7),
    ('c', 7),
    ('d', 6),
    ('e', 4),
    ('f', 7),
]

plotData(DATA,'blue')
plotData(DATA2,'red')

plt.gcf().savefig("correlation.png")
Run Code Online (Sandbox Code Playgroud)

我的DATA2集合对每个x轴值都有两个值.它在下面用红色绘制: 在此输入图像描述

编辑

你问的问题很广泛.我搜索了"相关性",维基百科对Pearson的乘积矩系数进行了很好的讨论,该系数表征了线性拟合的斜率.请记住,此值仅是一个指导,并且绝不预测线性拟合是否是一个合理的假设,请参阅上一页中有关相关性和线性的注释.这是一个更新的plotData方法,用于numpy.linalg.lstsq进行线性回归并numpy.corrcoef计算Pearson的R:

import matplotlib.pyplot as plt
import numpy as np

def plotData(inData,color):
    x,y = zip(*inData)

    xMap = assignIDs(x)
    xAsInts = np.array([xMap[i] for i in x])

    pearR = np.corrcoef(xAsInts,y)[1,0]
    # least squares from:
    # http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.lstsq.html
    A = np.vstack([xAsInts,np.ones(len(xAsInts))]).T
    m,c = np.linalg.lstsq(A,np.array(y))[0]

    plt.scatter(xAsInts,y,label='Data '+color,color=color)
    plt.plot(xAsInts,xAsInts*m+c,color=color,
             label="Fit %6s, r = %6.2e"%(color,pearR))
    plt.xticks(xMap.values(),xMap.keys())
    plt.legend(loc=3)
Run Code Online (Sandbox Code Playgroud)

新的数字是: 在此输入图像描述

同时展平每个方向并查看单个发行版可能很有用,它们是在matplotlib执行此操作的示例: 在此输入图像描述

如果线性近似是有用的,您可以通过查看拟合来定性地确定,您可能希望在平滑y方向之前减去此趋势.这将有助于表明您有关于线性趋势的高斯随机分布.


Joe*_*ton 6

我有点困惑......有几种方法可以沿着这些方向做点什么.想到的前两个是简单的干线图或散点图.

你只是想用这样的干线情节来绘制东西吗?

import matplotlib.pyplot as plt
data = [
    ('a', 4),
    ('b', 5),
    ('c', 5),
    ('d', 4),
    ('e', 2),
    ('f', 5),
]
labels, y = zip(*data)

x = range(len(y))
plt.stem(x, y)
plt.xticks(x, labels)
plt.axis([-1, 6, 0, 6])
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

或者像这样的散点图:

import matplotlib.pyplot as plt
data = [
    ('a', 4),
    ('b', 5),
    ('c', 5),
    ('d', 4),
    ('e', 2),
    ('f', 5),
]
labels, y = zip(*data)

x = range(len(y))
plt.plot(x, y, 'o')
plt.xticks(x, labels)
plt.axis([-1, 6, 0, 6])
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

或完全不同的东西?