2016-06-14 8 views
1

Ich versuche, ein Dot-Plot von zwei Datasets zu machen. Um diese beiden Datensätze zu vereinfachen, werde ich einige BriefeMachen Sie ein Punkt-Plot in Python

import matplotlib.pyplot as plt 
import numpy as np 

x = np.array([['a',1],['b',3],['c',4],['d',5],['e',6],['f',3]]) 
y = np.array([['c',3],['e',2],['b',6],['a',5],['h',5],['f',2]]) 

#in reality, those two arrays would be imported from two csv by np.genfromtext()... 

xticks = x[0:5,0] 
yticks = y[0:5,0] 
x0 = np.array(range(1,6)) 
y0 = np.array(range(1,6)) 

plt.xticks(x0, xticks) 
plt.yticks(y0, yticks) 

#Here should be the dot plot... 

plt.show()} 

von Dot-Plot habe ich auf die Tatsache beziehen, dass ich den Vergleich von zwei Gen-Proben, so dass die erste Spalte des Arrays entspricht dem Gen Namen und der zweite zu einem assoziierten Wert des Gens aus dieser Probe. In jedem Array folgen die Gene dieser Reihenfolge, sie können nicht geordnet werden.

Also, was ich versuche zu tun ist eine Handlung, wo jedes Coindicende ('b' mit 'b' in beiden Arrays, etc.) sollte als ein Punkt in dieser Handlung gesehen werden. Außerdem würde ich gerne beide Zahlen aus jeder Probe vergleichen (zum Beispiel (b1 + b2)/abs (b1-b2) für jede Koinzidenz), so dass diese Koinzidenzen mit ähnlicheren Zahlen als dunklere Flecken dargestellt werden (und jene weniger gleich leichter, oder so ähnlich).

Tat ich es geschafft, so zu tun, indem in beiden Arrays über jedes Element iteriert und ein Array mit dem Punktdiagramm zu machen (hier ist der Code für den Fall, Sie waren daran interessiert, für den originalen Code):

for fila in range(1, n): 
    for columna in range(1, n): 
     if tabla_final[fila,0] == tabla_final[0, columna]: 
      y = np.log((float(tabla_A[fila,2])*float(tabla_B[fila,2]))/abs((float(tabla_A[fila,2])-float(tabla_B[fila,2])))) 
      tabla_final[fila,columna] = y 
     else: 
      continue 

die Ergebnisse I (der dot-Plot) erhalten sind wie die (der dot-Plot in eine cSV exportiert wird):

Dies ist ein Rahmen der Werte für den Vergleich: This is a frame of the values for the comparison

Dies wäre die Punkt-Plot (grüner v erte sind besser Verbände und röter Werte sind schlechter: This would be the dot-plot (greener values are better associations and redder values are worse

Dies wäre der Fall für gleiche Proben sein: This would be the case for same samples.

Last but not least, wie ich mehrere Proben Zweier Vergleich wird, ich möchte um eine Art lineare Regression dieses Diagramms zu erhalten, mit dem Pearson'schen Koeffizienten, um die Ähnlichkeiten beider Stichproben zu bestimmen.

Vielen Dank für Ihre Beratung


EDIT: ich einen Algorithmus verwaltet, dass die Handlung zu tun. Mein Ziel war es, eine Liste mit drei Spalten zu erstellen, wobei die erste die Anzahl der Elemente auf der X-Achse ist, die zweite die Höhe jedes Punktes von der X-Achse und die dritte die Werte der 'Match'-Zelle . (Tatsächlich führt die aktuelle Version des Algorithmus vom oberen Teil des Diagramms aus, so dass das Endergebnis invertiert wird, da es logischer ist, dass diese Ergebnisse von (0,0) ausgehen).

Also ist dies ein Algorithmus, der über jede Spalte und jede Datei iteriert, bei der ersten Zelle stoppt, die nicht leer ist (es gibt nur eine, also kein Problem damit), und den Wert der Zelle zu addieren dritte Spalte aus dieser Liste:

import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.cm as cm 
from scipy import stats as st 
... 
def crear_grafico(tabla, N, muestra_x, muestra_y): 
tabla_valores = np.empty([N, 3], dtype = object) 
tabla_valores[0: tabla_valores.shape[0],0] = range(1, tabla_valores.shape[0] + 1) #asigna a la 1ª col de 1 a N+1 

for columna in range(1, N): 
    contador = 1 
    for fila in range(1, N): 
     if tabla[fila, columna] == '': 
      contador += 1 
     elif tabla[fila, columna] != '': 
      tabla_valores[columna-1, 1] = contador 
      tabla_valores[columna-1, 2] = tabla[fila, columna] 
      break 

Afterwars kehrte ich drei Listen (x, y und colores) mit den Werten jeder nicht leeren Spalte. Dann benutze ich scipy die Werte für die lineare Regression zu erhalten und verwenden matplotlib um die Grafik zu tun:

x, y, colores, contador = [], [], [], 0 
for elem in range(0,N): 
     if tabla_valores[elem,2] == None: 
      continue 
     elif tabla_valores[elem,1] == None: 
      continue 
     else: 
      x.append(tabla_valores[elem, 0]) 
      y.append(tabla_valores[elem, 1]) 
      colores.append(tabla_valores[elem,2]) 
      contador += 1 


    plt.xlabel('%s' %(muestra_x[0:-5])) 
    plt.ylabel('%s' % (muestra_y[0:-5])) 
    plt.axis([-5, N+5, -5, N+5]) 
    cax = plt.scatter(x,y, c =(colores), alpha = 1, linewidths = 0.3, cmap = 'gnuplot') 
    plt.colorbar(cax, label = '$\overline{x}_1$'+' x ' +'$\overline{x}_2$') 

    slope, intercept, r_value, p_value, std_err = st.linregress(x,y) 

    y_regre = [] 
    for x in tabla_valores[0:N,0]: 
     y_regre.append(intercept + slope * x) 
    plt.plot(tabla_valores[0:N,0], y_regre, color = 'grey') 
    if N == 100: 
     plt.text(2, N-4, 'r = %.5s' %(abs(r_value)), size = 10, color = 'Blue') 
     plt.text(2, N-12, 'n = %.5s' %(contador), size = 10, color = 'Blue') 
    if N == 250: 
     plt.text(10, N - 15, 'r = %.5s' % (abs(r_value)), size=10, color='Blue') 
     plt.text(10, N - 30, 'n = %.5s' % (contador), size=10, color='Blue') 

ich diese Zeilen stellen für N == 250 und N == 100 so dass die Etiketten für den r-Wert von Pearson und die Anzahl der Proben waren an Ort und Stelle.

Schließlich verwende ich diese Funktion in Haupt() aufrufen und das ist alles:

def main(): 
    N =250 
    plt.figure() 
    plt.subplot(2,2,1) 
    muestra_x, muestra_y = 'SATfinal', 'MBfinal' 
    tabla = crear_tabla(N, muestra_x, muestra_y) 
    crear_grafico(tabla, N, muestra_x, muestra_y) 
    ... 
    plt.show() 

Dies ist das Ergebnis wäre: result

+0

Sie haben erfolgreich die Dotplot zu erstellen. Was ist dann deine Frage? Fragen Sie nur nach einem Maß an Ähnlichkeit wie dem Pearson-Koeffizienten? Ich möchte darauf hinweisen, dass Ihre Distanzfunktion (b1 + b2)/abs (b1-b2) möglicherweise zu einem Fehler führt im Falle von b1 = b2, was zu einer Division durch Null führt. Daher schlage ich andere Entfernungsmessungen vor, wie Euklidische Entfernung https://en.wikipedia.org/wiki/Euclidean_distance –

+0

Nun, in diesem Moment war es mir nicht gelungen, den Punkt-Plot zu machen, denn das, was ich benutzte, war Excel, und ich wollte etwas mehr Dinamic mit Python. Aber vor einigen Wochen habe ich es geschafft, also danke trotzdem. –

+0

Wenn Sie die Zeit dafür finden, wäre es großartig, wenn Sie Ihre Lösung als Antwort auf Ihre eigene Frage bereitstellen könnten. –

Antwort

-1

Ich würde für Schleife eine verschachtelte verwenden hier, iterieren die beiden Datensätze und berechnen den Parameter '(b1 + b2)/abs (b1-b2)', wenn die Bedingung (b im ersten Datensatz und b im zweiten Datensatz) erfüllt ist. Sie können dann eine 2-D-Liste mit den entsprechenden Werten füllen und matplotlib.pyplot.imshow() verwenden, um eine Heatmap zu generieren.

Einige Pseudo-Code zu zeigen, was ich meine:

heatmap = [[]] # 2d list for the heatmap 
for a in dataset1: 
    row = [] # Contains comparison results of a to whole dataset2 
    for b in dataset2: 
    # These nested for loops iterates over the whole datasets and 
    # compare all values to one another 
    if a in dataset2: 
     # If this holds, we know a is in both datasets 
     calculate parameter 
    else: 
     parameter = 0 
    row.append(parameter) 
    heatmap.append(row) 

plt.imshow(heatmap) 
Verwandte Themen