假设我有一个带n=2
的离散向量数据集:
DATA = [
('a', 4),
('b', 5),
('c', 5),
('d', 4),
('e', 2),
('f', 5),
]
如何使用matplotlib绘制该数据集,以便可视化两个变量之间的任何相关性?
任何简单的代码示例都会很棒。
答案 0 :(得分:19)
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的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方向之前减去此趋势。这将有助于表明您有关于线性趋势的高斯随机分布。
答案 1 :(得分: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()
或者像这样的散点图:
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()
还是别的什么呢?