【问题标题】:Drawing a correlation graph in matplotlib在 matplotlib 中绘制相关图
【发布时间】:2011-11-16 15:51:05
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: python graph matplotlib data-visualization


    【解决方案1】:

    Joe Kington 有正确的答案,但你的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")
    

    我的DATA2 集对于每个 x 轴值都有两个值。它在下面用红色绘制:

    编辑

    您提出的问题非常广泛。我搜索了“相关性”,Wikipedia 对 Pearson 的乘积矩系数进行了很好的讨论,该系数表征了线性拟合的斜率。请记住,这个值只是一个指导,并不能预测线性拟合是否是一个合理的假设,请参阅上一页 correlation and linearity 中的注释。这是一个更新的plotData 方法,它使用numpy.linalg.lstsq 进行线性回归和numpy.corrcoef 计算Pearson's 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)
    

    新的数字是:

    同时展平每个方向并查看各个分布可能很有用,它们是doing this in matplotlib 的示例:

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

    【讨论】:

    • 嗨 Yann.. 感谢您的脚本。我不了解唯一列表部分。您只是将浮点值转换为整数。 x 轴仍然包含重复值对吗?
    【解决方案2】:

    我有点困惑...有几种方法可以按照这些方式做某事。想到的前两个是简单的茎图或散点图。

    你只是想用这样的茎图来绘制东西吗?

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

    或者像这样的散点图:

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

    或者完全是别的什么?

    【讨论】:

      猜你喜欢
      • 2019-08-03
      • 1970-01-01
      • 2022-08-16
      • 2012-11-19
      • 1970-01-01
      • 2019-04-09
      • 2011-06-23
      • 2021-10-02
      • 2016-02-09
      相关资源
      最近更新 更多