熊猫:将多列数据绘制到同一X值上

2024-09-27 21:29:54 发布

您现在位置:Python中文网/ 问答频道 /正文

关于熊猫数据分析的后续工作。我现在要绘制数据,如下所示:

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)

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

enter image description here

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

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


Tags: 数据id绘制数字nan比率sequencegene
3条回答

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

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

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

我也遇到过类似的问题。我认为标签和标记不匹配的问题在于如何遍历数据。

让熊猫工作的建议:

正如其他人提到的,我总是从重复检查数据类型开始。确保没有任何行包含奇怪的内容(NaNs、符号或其他缺少的值,通常会导致打印包出现此类错误)。

如果还没有删除NAs,请根据需要显式地将整列转换为适当的数据类型。

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

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

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

最近我使用了seaborn,它似乎与“objects”没有相同的问题。具体来说,你可能想看看肖伯恩的工厂。Seaborn还提供了简单的调色板选项,因此可能会为您解决其中的多个问题。

如果你还没有,你可能想试试熊猫的把戏:

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

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

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

df = df.convert_objects(convert_numeric=True)

我设法找到了一种保留字符串名称的方法!我想了想你所说的寻找身份证号码的方法,我想我可以使用索引,它运行得很好。

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?

相关问题 更多 >

    热门问题