关于使用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
...除了有更多行,我实际上并不想绘制比率,而是从它们派生出一些其他计算值,但这对我的绘图问题无关紧要。我有一个看起来或多或少像上面的数据的数据框,我想要的是这个:
下面是我之前的非pandas版本的此脚本产生的图像:
...其中红色三角形表示用于设置y轴最大值的截止值之外的值。 ID被涂黑了,但你应该能够看到我正在追求的东西。复制数基本上是在它们之上进行计算的比率,因此它们只是另一个数字,而不是我在上面数据中显示的数字。
我试图在文档中找到类似的问题和解决方案,但没有找到。大多数人似乎需要使用日期来做这个,因为日期似乎有现成的绘图功能,这对我没有帮助(我认为)。任何帮助非常感谢!
答案 0 :(得分:6)
跳过一些更精细的绘图点,得到:
我建议您尝试使用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轴限制,每个刻度还有三个值(尽管没有更多的刻度)。它看起来像这样:
这里有什么问题,为什么所有值都不会映射到正确的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)