2014-01-14 56 views
7

後續到previous question關於數據分析與熊貓。我現在想繪製我的數據,它看起來像這樣:熊貓:繪製多列到相同的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 

...除了有一堆更行,我真的不希望顯示來自它們的比值但其他一些計算值,但對我的繪圖問題無關緊要。我有一個數據幀,看起來或多或少類似的數據之上,我想是這樣的:

  • 每一行(3分比)應該與該行的ID被繪製,如點
  • 所有與行相同的ID應繪製爲相同的x值/ ID, 但用另一種顏色
  • x ticks應該是ID和(如果 可能)也是相應的基因(所以有些基因會在幾個x上出現 蜱,因爲它們具有映射到它們的多個ID)

下面是我以前的,非熊貓這個腳本的版本產生圖像:

enter image description here

...其中紅色三角形表示用於設置Y軸最大臨界值之外的值,值。這些ID是黑色的,但你應該能夠看到我在做什麼。拷貝數本質上是一個計算在上面的比率,所以它們只是另一個數字,而不是我在上面的數據中顯示的數字。

我試圖在文檔中找到類似的問題和解決方案,但沒有找到。大多數人似乎需要用日期來做到這一點,對此,似乎有現成的繪圖功能,這並沒有幫助我(我認爲)。任何幫助非常感謝!

回答

6

跳過一些陰謀的細節問題,可以得到:

  • 每一行(3分比)應該與該行的ID具有相同ID的繪製,爲點
  • 的所有行應繪製到另一個顏色
  • x ticks應該是ID和(如果可能的話)相應的基因(所以有些基因會出現在幾個x ticks上,因爲它們有多個IDs映射給他們)

我建議你嘗試使用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

澄清:實際ID是保密字符串,因此這裏是非常簡單的數字ID。 – Sajber

+0

你可以使用一個數字作爲ID,並使用保密字符串有一列(如基因和序列)?我認爲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']) 

現在我還有一些其他問題。直到現在我還沒有意識到,但在繪製上述圖像時,它並不是,而是我想要的。這樣做會給我每個ID x tick三個值,然後繪製繼續在x軸限制以外的,每個tick有三個更多的值(儘管沒有更多的tick)。它看起來像這樣:

Weird plot beyond x ticks

這裏有什麼問題,爲什麼會不是所有的值映射到正確的ID?

0

我有類似的問題。我認爲你使用不匹配標籤&標記的問題是因爲你如何迭代數據。

建議讓大熊貓的工作:

正如其他人所提到的,我總是仔細檢查數據類型開始。確保你沒有任何有奇怪東西的行(NaN,符號或其他缺失的值,通常會導致這種打印包的錯誤)。

如果您尚未安裝NA,則根據需要將整個列顯式轉換爲適當的dtype。

在熊貓中,「對象」與「字符串」不同,一些繪圖軟件包不喜歡「對象」(見下文)。

如果我的索引不連續(如果您放棄NAs,您可能必須重新索引),或者如果我的x軸值未預先排序,我也會遇到奇怪的問題。

(請注意,matplotlib喜歡的數字,但其它繪圖程序包可以的方式,會讓你的生活輕鬆了許多處理分類數據。)

最近我使用seaborn,這似乎並不具有相同的「物體」的種類問題。具體來說,你可能想看看seaborn的factorplot。 Seaborn也具有調色板的簡單選項,因此可能爲您解決多個這些問題。

你可能會想嘗試一些熊貓的招數,如果您尚未:

轉換代碼明確對象爲字符串:

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

或掉落的字母,如你所說,並轉換對象,而不是爲數值:

df = df.convert_objects(convert_numeric=True)