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

时间:2014-01-14 09:05:43

标签: python matplotlib plot pandas

关于使用pandas进行数据分析的previous question的后续行动。我现在想要绘制我的数据,如下所示:

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刻度应该是ID,和(如果 可能的)相应的基因(因此会出现一些基因) 在几个x刻度上,因为它们有多个ID映射到它们)

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

enter image description here

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

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

3 个答案:

答案 0 :(得分: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")

如果您有很多行,您可能需要更多颜色,但这至少显示了这个概念。

答案 1 :(得分:0)

我设法找到了保留字符串名称的方法!我想到了你所说的关于为ID找到数字的说法,并认为我可以使用索引,它工作得很好。

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刻度三个值,然后绘制继续超出x轴限制,每个刻度还有三个值(尽管没有更多的刻度)。它看起来像这样:

Weird plot beyond x ticks

这里有什么问题,为什么所有值都不会映射到正确的ID?

答案 2 :(得分:0)

我遇到过类似的问题。我认为你所遇到的标签与标签不匹配的问题标记是因为你在如何迭代数据。

让大熊猫开始工作的建议:

正如其他人提到的,我总是首先仔细检查数据类型。确保您没有任何包含奇怪内容的行(NaN,符号或其他缺失值,通常会在绘制包时导致此类错误)。

如果尚未删除NA,则根据需要将整列显式转换为适当的dtype。

在pandas中,'object'与'string'不同,并且一些绘图包不喜欢'objects'(见下文)。

如果我的索引不连续(如果你丢弃NA,你可能需要重新索引),或者如果我的x轴值没有预先排序,我有时会遇到奇怪的问题。

(请注意,matplotlib更喜欢数字,但其他绘图包可以处理分类数据,使您的生活更轻松。)

最近我使用seaborn,它似乎与“对象”没有相同的问题。具体来说,你可能想看看seaborn的factorplot。 Seaborn还有简单的调色板选项,因此可以为您解决多个问题。

如果您还没有尝试过,可能需要尝试一些大熊猫技巧:

将您的代码对象显式转换为字符串:

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

或按照建议删除字母,然后将对象转换为数字:

df = df.convert_objects(convert_numeric=True)