2016-06-14 2 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()} 

По дот-сюжет я имею в виду тот факт, что я сравниваю два образца гена, так что первый столбец массива соответствует имени гена и второе - связанное с ним значение этого образца. В каждом массиве гены следуют этому порядку, их нельзя упорядочить.

Итак, что я пытаюсь сделать, это график, в котором каждый 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

Это будет dot-plot (более зеленый v 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 Pearson как способом оценки сходства обоих образцов.

Спасибо за ваши советы


EDIT: Мне удалось алгоритм, чтобы сделать этот участок. Моя цель состояла в том, чтобы создать один список с тремя столбцами, поскольку это просто диапазон элементов на оси 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, я вернулся три списка (х, у и 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 == 250 и N == 100 так, чтобы метки для г значения Пирсона и количество образцов были на месте.

Наконец, я использую называют эту функцию в основной(), и это все:

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

Ты удастся создать dotplot. Что же это за твой вопрос? Вы только просите меру подобия, такую ​​как коэффициент Пирсона? Я хочу указать, что ваша функция расстояния (b1 + b2)/abs (b1-b2) может привести к ошибке в случае b1 = b2, что приводит к делению на ноль. Поэтому я предлагаю другие измерения расстояния, такие как Euclidean Distance https://en.wikipedia.org/wiki/Euclidean_distance –

+0

Ну, в тот момент мне не удалось сделать точечный график, поскольку то, что я использовал, было Excel, и я хотел что-то более динамичный с питоном. Однако несколько недель назад мне удалось это сделать, так что спасибо вам в любом случае. –

+0

Если вы нашли подходящее время, было бы замечательно, если бы вы могли предоставить свое решение в качестве ответа на свой вопрос. –

ответ

-1

Я хотел бы использовать вложенный цикл здесь, чтобы перебрать двух наборов данных и вычислить параметр '(b1 + b2)/abs (b1-b2)', если выполняется условие (b в первом наборе данных и b во втором наборе данных). Затем вы можете заполнить 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) 
Смежные вопросы