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:
Dies wäre die Punkt-Plot (grüner v erte sind besser Verbände und röter Werte sind schlechter:
Dies wäre der Fall für gleiche Proben sein:
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:
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 –
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. –
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. –