2016-06-14 21 views
1

我正在尝试制作两个数据集的点图。为了简化这两个数据集,我就会把一些字母在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()} 

通过点图我指的是我比较两个基因样本的事实,所以数组的第一列对应于基因名和第二个来自该样本的gen的相关值。在每个阵列中,基因遵循这个顺序,它们不能被排序。

所以,我想要做的是一个情节,其中每个coindicende('b'和'b'在两个数组中等等)都应该被看作是该情节中的一个点。此外,我想比较每个样本的两个数字(例如,每个重合的(b1 + b2)/ abs(b1-b2)),以便将那些与数字更相似的巧合表示为较暗的点(以及较少的点一样轻,或类似的东西)。

事实上,我设法通过遍历两个阵列中的每个元素,使与点图的数组这么做(在这里是在情况下,代码你有兴趣,对原码):

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 

我得到(圆点曲线)的结果是类似的(在此点图被导出到CSV):

这是用于比较的值的帧: This is a frame of the values for the comparison

这将是点图(更绿色的诉alues更好协会和偏红的值是糟糕: This would be the dot-plot (greener values are better associations and redder values are worse

这将是同一样品的情况: This would be the case for same samples.

最后但并非最不重要的,我将两个两个地比较多个样品,我想得到这种图的某种线性回归,以皮尔森的r系数作为评估两种样品相似性的一种方式。

谢谢您的建议


编辑:我管理的算法来做到这一点的情节。我的目标是创建一个包含三列的列表,其中最简单的就是x轴上的元素范围,第二列是x轴上每个点的高度,第三列是“匹配”单元格的值。 (实际上,算法的当前版本是从图的顶部开始的,所以最终的结果是相反的,因为这些结果从(0,0)开始依次更加合理)。

因此,这是一种迭代遍历每列和每个文件的算法,停止在非空的第一个单元格(只有一个,因此没有问题),并将单元格的值添加到从列表中第三列:

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 

经过一段时间后,我返回了三个列表(x,y和colores)与每个非空列的值。然后,我使用SciPy的获得的值的线性回归,并使用matplotlib做图:

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

我把这些线N == 250N == 100使得标签的皮尔森r值和采样的数量在原地。

最后,我用调用主要是()函数,这一切:

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

这将是结果: result

+0

你没有成功创建散点图。那么,你的问题是什么?你只是要求一个相似的度量,比如皮尔逊系数吗?我想指出,在b1 = b2的情况下,您的距离函数(b1 + b2)/ abs(b1-b2)可能会导致错误,导致零除。因此,我建议其他距离测量,如欧几里得距离https://en.wikipedia.org/wiki/Euclidean_distance –

+0

那么,那一刻我没有成功做点图,因为我使用的是Excel,我想要的东西与蟒蛇更加动感。但是,几周前我设法做到了,所以无论如何都谢谢你。 –

+0

如果你有时间这样做,如果你能提供你的解决方案作为你自己问题的答案,那将是非常好的。 –

回答

-1

我会用一个嵌套循环这里,遍历两个数据集,并且如果条件(第一数据集中的b和第二数据集中的b)成立,则计算'(b1 + b2)/ abs(b1-b2)'参数。然后,您可以使用相应的值填充2d列表,并使用matplotlib.pyplot.imshow()生成热图。

一些伪代码说明我的意思:

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)