熊猫:将多个列绘制为相同的x值

eri*_*fas 8 python plot matplotlib pandas

关于使用pandas进行数据分析的上一个问题的后续内容.我现在想要绘制我的数据,如下所示:

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  
Run Code Online (Sandbox Code Playgroud)

...除了有更多的行,我实际上并不想绘制比率,而是从它们派生出一些其他计算值,但这对我的绘图问题无关紧要.我有一个看起来或多或少像上面的数据的数据框,我想要的是这样的:

  • 应将每行(3个比率)与行的ID作为点绘制
  • 具有相同ID的所有行应绘制为相同的x值/ ID,但使用其他颜色
  • x刻度应该是ID,并且(如果可能的话)相应的基因也是如此(因此一些基因将出现在几个x刻度上,因为它们有多个ID映射到它们)

下面是我之前的非pandas版本的脚本生成的图像:

在此输入图像描述

...其中红色三角形表示用于设置y轴最大值的截止值之外的值.ID被涂黑了,但你应该能够看到我正在追求的东西.复制数基本上是在它们之上进行计算的比率,因此它们只是另一个数字,而不是我在上面的数据中显示的数字.

我试图在文档中找到类似的问题和解决方案,但没有找到.大多数人似乎需要使用日期来做这个,因为日期似乎有现成的绘图功能,这对我没有帮助(我认为).任何帮助非常感谢!

Noa*_*ner 6

跳过一些更精细的绘图点,得到:

  • 应将每行(3个比率)与行的ID作为点绘制
  • 具有相同ID的所有行应绘制为相同的x值/ ID,但使用其他颜色
  • x刻度应该是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")
Run Code Online (Sandbox Code Playgroud)

如果你有很多行,你可能会想要更多的颜色,但这至少显示了这个概念.