Joe Kington ha la risposta corretta, ma il tuo DATA
probabilmente è più complicato rappresentato. Potrebbe avere più valori in "a". Il modo in cui Joe crea i valori dell'asse x è veloce ma funziona solo per un elenco di valori univoci. Ci può essere un modo più veloce per fare questo, ma questo come ho realizzato che:
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")
mio DATA2
insieme ha due valori per ogni valore dell'asse x. E 'tracciata in rosso sotto: 
EDIT
La domanda che hai fatto è molto ampio. Ho cercato 'correlazione' e Wikipedia ha avuto una buona discussione sul coefficiente momento prodotto di Pearson, che caratterizza la pendenza di un adattamento lineare. Tieni presente che questo valore è solo una guida e non prevede in alcun modo se un accoppiamento lineare sia un presupposto ragionevole, vedi le note nella pagina sopra al numero correlation and linearity. Ecco una versione aggiornata plotData
metodo, che utilizza numpy.linalg.lstsq
fare regressione lineare e numpy.corrcoef
per calcolare R di Pearson:
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)
La nuova figura è: 
appiattimento anche ogni direzione e guardando alle singole distribuzioni potrebbero essere utili, e sono esempi di doing this in matplotlib: 
Se è utile un'approssimazione lineare, che è possibile determinare qualitativa osservando semplicemente il fit, potresti voler sottrarre questa tendenza prima di flattingare la direzione y. Ciò aiuterebbe a mostrare che hai una distribuzione casuale gaussiana su una tendenza lineare.
Ciao Yann .. Grazie per la sceneggiatura. Non ho capito della lista di parti uniche. Stai solo convertendo i valori in virgola mobile in numeri interi. L'asse x contiene ancora valori duplicati, giusto? – mdasari