【问题标题】:Pandas: plot multiple columns to same x valuePandas:将多列绘制到相同的 x 值
【发布时间】:2014-01-14 09:05:42
【问题描述】:

跟进previous question 关于 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  

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

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

下面是我以前的非熊猫版本的脚本生成的图像:

... 其中红色三角形表示用于设置 y 轴最大值的截止值之外的值。身份证被涂黑了,但你应该能看到我在寻找什么。拷贝数本质上是在它们之上进行计算的比率,因此它们只是另一个数字,而不是我在上面的数据中显示的数字。

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

【问题讨论】:

    标签: python matplotlib plot pandas


    【解决方案1】:

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

    • 每行(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")
    

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

    【讨论】:

    • 我尝试按原样使用您的代码(除了我必须将 color.next() 更改为 next(color)),它工作正常,但是当我使用实际数据进行尝试时,它没用:我只得到一个“ValueError:无法将字符串转换为浮点数:'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' 绘制的,如果有帮助的话。 (这应该是一个编辑吗?不确定你通常如何在这里做这些事情)。
    • 澄清一下:实际的 ID 是机密字符串,因此这里使用非常简单的数字 ID。
    • 你能用一个数字作为 ID 并有一个包含机密字符串的列(如基因和序列)吗?我认为 ValueError 是因为试图将字符串用作数字(至少,这是我之前遇到的问题)。
    • 你用的是python2还是3(我是在python2中做的)。随意发布与您的真实数据相似的内容(但使用虚假值)。
    • 我确实想要情节中的正确 ID,恐怕 =/ 我想我唯一能做的就是删除它们开头的“HPRR”,使它们变成数字。为此,我尝试使用 .replace ,但没​​有成功。我正在使用 Python 3.3。在编辑中添加了一些格式更正确的数据。
    【解决方案2】:

    我设法找到了保留字符串名称的方法!我考虑了您所说的为 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 轴限制,每个刻度还有三个值(尽管没有更多刻度)。它看起来像这样:

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

    【讨论】:

      【解决方案3】:

      我也遇到过类似的问题。我认为您遇到的标签和标记不匹配的问题是因为您遍历数据的方式。

      让 pandas 工作的建议:

      正如其他人提到的,我总是从仔细检查数据类型开始。确保没有任何行中有奇怪的东西(NaN、符号或其他缺失值,通常会在绘图包中导致这种类型的错误)。

      如果您还没有删除 NA,然后根据需要将整个列显式转换为适当的 dtype。

      在 pandas 中,“对象”与“字符串”不同,一些绘图包不喜欢“对象”(见下文)。

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

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

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

      如果您还没有尝试过,您可能想尝试一些 pandas 技巧:

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

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

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

      df = df.convert_objects(convert_numeric=True)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-16
        • 2019-06-30
        • 2021-05-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多