2014-01-14 2 views
7

Последующее наблюдение за previous question относительно анализа данных с помощью панд. Теперь я хочу, чтобы построить мои данные, которые выглядит следующим образом:Pandas: построение нескольких столбцов с одинаковым значением x

PrEST ID Gene Sequence  Ratio1 Ratio2 Ratio3 
HPRR12 ATF1 TTPSAXXXXXXXXXTTTK 6.3222 4.0558 4.958 
HPRR23 CREB1 KIXXXXXXXXPGVPR  NaN  NaN  NaN  
HPRR23 CREB1 ILNXXXXXXXXGVPR  0.22691 2.077  NaN 
HPRR15 ELK4 IEGDCEXXXXXXXGGK 1.177  NaN  12.073 
HPRR15 ELK4 SPXXXXXXXXXXXSVIK 8.66  14.755 NaN 
HPRR15 ELK4 IEGDCXXXXXXXVSSSSK 15.745 7.9122 9.5966 

... кроме того есть куча строк больше, и я на самом деле не хочу, чтобы построить соотношения, но и некоторые другие расчетные значения, полученные из них , но это не имеет значения для моей проблемы с графикой. У меня есть dataframe, который выглядит более или менее, как эти данные выше, и то, что я хочу это:

  • Каждая строка (3 отношения) должны быть нанесены на ID в строке и, как точки
  • Все строки с тот же идентификатор должен быть построен к тому же значению х/ID, , но с другим цветом
  • х клещами должна быть идентификаторами, и (если возможно) соответствующий ген, а также (так что некоторые гены будут появляться по нескольким х клещей, поскольку у них имеется множественное сопоставление идентификаторов)

Ниже изображение, что моя предыдущая, не панды версия этого скрипта производит:

enter image description here

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

Я попытался найти похожие вопросы и решения в документации, но не нашел их. Большинство людей, похоже, должны делать это с датами, для которых, кажется, есть готовые функции построения, что мне не помогает (я думаю). Любая помощь очень ценится!

ответ

6

Пропуск некоторых тонкостей черчения, чтобы получить:

  • Каждой строка (3 отношения) должно быть нанесена на ID в строке и, как точки
  • Всех строк с тем же ID должен быть нанесен к тому же значению x/ID, но с другим цветом
  • Х-тики должны быть идентификаторами и (если возможно) соответствующим геном (так что некоторые гены появятся на нескольких х-тиках, так как они имеют множественное отображение идентификаторов к ним)

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

import matplotlib.pyplot as plt 
import pandas as pd 
import itertools 
#data 
df = pd.DataFrame(
    {'id': [1, 2, 3, 3], 
    'labels': ['HPRR1234', 'HPRR4321', 'HPRR2345', 'HPRR2345'], 
    'g': ['KRAS', 'KRAS', 'ELK4', 'ELK4'], 
    'r1': [15, 9, 15, 1], 
    'r2': [14, 8, 7, 0], 
    'r3': [14, 16, 9, 12]}) 
#extra setup 
plt.rcParams['xtick.major.pad'] = 8 
#plotting style(s) 
marker = itertools.cycle((',', '+', '.', 'o', '*')) 
color = itertools.cycle(('b', 'g', 'r', 'c', 'm', 'y', 'k')) 
#plot 
fig = plt.figure() 
ax = fig.add_subplot(111) 
ax.plot(df['id'], df['r1'], ls='', ms=10, mew=2, 
     marker=marker.next(), color=color.next()) 
ax.plot(df['id'], df['r2'], ls='', ms=10, mew=2, 
     marker=marker.next(), color=color.next()) 
ax.plot(df['id'], df['r3'], ls='', ms=10, mew=2, 
     marker=marker.next(), color=color.next()) 
# set the tick labels 
ax.xaxis.set_ticks(df['id']) 
ax.xaxis.set_ticklabels(df['labels']) 
plt.setp(ax.get_xticklabels(), rotation='vertical', fontsize=12) 
plt.tight_layout() 
fig.savefig("example.pdf") 

Если у вас есть много строк, вы, вероятно, хотите больше цветов, но это показывает, по крайней мере, понятие.

+0

Я попытался с помощью кода как есть (за исключением я должен был измените color.next() на следующий (цвет)), и он отлично работает, но когда я попробовал его с фактическими данными, он не работал: я получаю только «ValueError: не могу преобразовать строку в float:» IDx «». Фактический DataFrame, который я хочу построить, это: peptide_data = data [['ID', 'Gene names', 'Sequence', 'Ratio H/L HCT_1', 'Ratio H/L HCT_2', 'Ratio H/L HCT_3 ',' pepCN1 ',' pepCN2 ',' pepCN3 ',' pepMedian ',' pepCV ']], где pepCN1, pepCN2 и pepCN3 - это то, что я хочу построить против «ID», если это помогает. (Если это было редактирование? Не знаете, как вы обычно это делаете здесь). – Sajber

+0

Чтобы уточнить: фактические идентификаторы являются конфиденциальными строками, поэтому здесь очень простые числовые идентификаторы. – Sajber

+0

Можете ли вы использовать число для идентификатора и иметь столбец (например, ген и последовательность) с конфиденциальными строками? Я думаю, что ValueError пытается использовать строку как число (по крайней мере, это проблема, с которой я столкнулся раньше). –

0

Мне удалось найти способ сохранить имена строк! Я подумал о том, что вы сказали о поиске номеров для идентификаторов, и решил, что я могу использовать индекс, который работал отлично.

fig = plt.figure() 
ax = fig.add_subplot(111) 
ax.plot(df.index,df['r1'], ls='', marker=marker.next(), color=next(color)) 
ax.plot(df.index,df['r2'], ls='', marker=marker.next(), color=next(color)) 
ax.plot(df.index,df['r3'], ls='', marker=marker.next(), color=next(color)) 

ax.xaxis.set_ticks(df.index) 
ax.xaxis.set_ticklabels(df['g']) 

Теперь у меня есть другие проблемы. Я не догадывался об этом до сих пор, но при построении рисунка, как и выше, работает, это не точно так, как я этого хотел.Выполнение этого, как это, даст мне три значения для каждого идентификатора x, а затем график продолжит за пределы х-оси, с тремя значениями за галочку (хотя больше нет галочек). Это выглядит следующим образом:

Weird plot beyond x ticks

Что здесь не так, и почему не все значения отображаются на правильный ID?

0

У меня были схожие проблемы. Я думаю, что проблема, с которой вы сталкиваетесь с несогласованными метками &, связана с тем, как вы повторяете данные.

Предложения для получения панды работы:

Как уже упоминалось другие люди, я всегда начинаю двойные проверки типов данных. Удостоверьтесь, что у вас нет строк со странными вещами (NaNs, символы или другие пропущенные значения часто будут вызывать этот тип ошибок при построении пакетов).

Отбросьте NA, если вы еще этого не сделали, затем явно конвертируйте целые столбцы в соответствующий dtype по мере необходимости.

В pandas «объект» не совпадает с «строкой», а некоторые из пакетов построения не похожи на «объекты» (см. Ниже).

У меня также возникали странные проблемы, иногда, если мой индекс не был непрерывным (если вы отбрасываете NA, вам, возможно, придется переиндексировать), или если мои значения по оси x не были предварительно отсортированы.

(Обратите внимание, что Matplotlib предпочитает номера, но и другие пакеты Plotting может обрабатывать категорические данные способами, которые сделают вашу жизнь намного проще.)

В последнее время я использую seaborn, который, кажется, не имеют такой же виды проблем с «объектами». В частности, вы можете взглянуть на факторный план моряка. У Seaborn также есть легкие возможности для цветовых палитр, поэтому вы можете решить более чем одну из этих проблем для вас.

Некоторые приемы панды вы можете попробовать, если вы еще не:

преобразования код объекты явно строки:

df['code_as_word'] = df['secretcodenumber'].astype(str)

Или падение буквы, как Вы предложили, и конвертировать объекты в числовые вместо:

df = df.convert_objects(convert_numeric=True)

Смежные вопросы