在python中制作一个点图

时间:2016-06-14 11:06:31

标签: python arrays matplotlib plot

我正在尝试制作两个数据集的点图。为了简化这两个数据集,我会写一些字母

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

这将是点图(更环保的值是更好的关联,更红的值更糟: This would be the dot-plot (greener values are better associations and redder values are worse

相同样本的情况如下: This would be the case for same samples.

最后但并非最不重要的是,由于我将逐两比较多个样本,我想获得该图的某种线性回归,Pearson的r系数作为评估两个样本相似性的方法。 / p>

感谢您的建议

编辑:我管理了一个算法来做那个情节。我的目标是创建一个包含三列的列表,最简单的是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

Afterwars,我返回了三个列表(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添加了这些行,以便Pearson的r值和样本数量的标签就位。

最后,我在main()中使用call函数,那就是:

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

1 个答案:

答案 0 :(得分:-1)

我会在这里使用嵌套for循环,迭代两个数据集,并计算'(b1 + b2)/ abs(b1-b2)'参数,如果条件(第一个数据集中的b和第二个数据集中的b)成立。然后,您可以使用相应的值填充二维列表,并使用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)