Python和Matplotlib:将字符作为x轴

4

大家好,我在使用matplotlib编写代码时感觉很困难,如果有其他更适合我的Python库,请告诉我!

我有一整个蛋白质(用图片中的大写字母表示)的氨基酸序列(称为蛋白质x),这将成为我的x轴。

我有两列Excel:疾病和对照组。这些列包含整个蛋白质x的氨基酸序列的部分。有时,疾病或对照组中会有多个相同的氨基酸片段。我希望它们能够叠加在一起,以便可以看到疾病和对照组对蛋白质x有多少影响。

如果你感到困惑了,不好意思,请看下面使用PowerPoint制作的示例。

氨基酸比较

黑色文本是参考序列。紫色是对照组。粉色是疾病。现在明白了吗?

我需要处理一个非常大的数据集,所以不,我不想“花几个小时使用PowerPoint”。我还想使用任何我选择的参考序列进行处理。

我不是要求别人帮我完成任务。我需要指点迷津。是否有特殊的库?我应该把所有内容转换成数字,然后重新标记为文本吗?

感谢您的帮助和建议。


嗨,Alex。如果您需要对大型数据集执行序列比对分析,则可以尝试使用Biopython生物信息学包(http://biopython.org/wiki/AlignIO)。至于可视化方面,我不确定Python是否有专门满足您需求的工具。Matplotlib是一种非常灵活的工具,可以用来重现您的样本图,但最好提供样本数据和您已经尝试过的代码。 - Brian
你的疾病和控制列具体是什么意思?除非你遗漏了巨大的对齐细节或这些列与X的长度相同并且一一对应于其中的每个氨基酸,否则你所说的都没有意义。 @Brian,他难道不是在说明这些列与X的长度不是一对一的关系,而是它们自己的单独序列吗? - Krupip
感谢您迄今为止的帮助和建议。是的,我还需要想出如何将疾病和对照列的每一行与蛋白质x的序列对齐。疾病和对照列的行包含长度在5-15个字母之间的序列,应该完美地对齐到蛋白质x的一部分(在图像中以紫色和粉色表示)。我认为我将能够用biopython做到这一点,但很难想象我如何可视化对齐的数据。 - Alex Nesta
对于定制图形,我有时使用Python编写程序生成TikZ代码。尽管如此,这可能会导致大型PDF文件。 - bli
2个回答

2
使用脚本创建SVG图像,它是XML文本。我将处理简单一些的内容!
假设你的目标是这样的。 overall image 首先,在每个字符串片段列的地方分隔大字符串。在此示例中为 'EF' 和 'IJKL'。您可以使用SVG XML的特性定位大字符串的片段。由于您知道片段的开始位置和字符的高度,因此可以定位列中的层。
这就是您需要构建的东西。
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->

<svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
   width="210mm"
   height="297mm"
   viewBox="0 0 210 297"
   version="1.1"
   id="svg8"
   inkscape:version="0.92.0 r15299"
   sodipodi:docname="genes.svg">
  <defs
     id="defs2" />
  <sodipodi:namedview
     id="base"
     pagecolor="#ffffff"
     bordercolor="#666666"
     borderopacity="1.0"
     inkscape:pageopacity="0.0"
     inkscape:pageshadow="2"
     inkscape:zoom="1.4"
     inkscape:cx="170.60599"
     inkscape:cy="341.08014"
     inkscape:document-units="mm"
     inkscape:current-layer="layer1"
     showgrid="false"
     inkscape:window-width="1095"
     inkscape:window-height="676"
     inkscape:window-x="145"
     inkscape:window-y="122"
     inkscape:window-maximized="0" />
  <metadata
     id="metadata5">
    <rdf:RDF>
      <cc:Work
         rdf:about="">
        <dc:format>image/svg+xml</dc:format>
        <dc:type
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
        <dc:title></dc:title>
      </cc:Work>
    </rdf:RDF>
  </metadata>
  <g
     inkscape:label="Layer 1"
     inkscape:groupmode="layer"
     id="layer1">
    <text
       xml:space="preserve"
       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:9.8777771px;line-height:6.61458302px;font-family:Courier;-inkscape-font-specification:Courier;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332;"
       x="24.588797"
       y="179.4014"
       id="text12"><tspan
         sodipodi:role="line"
         id="tspan10"
         x="24.588797"
         y="185.32886"
         style="stroke-width:0.26458332;-inkscape-font-specification:Courier;font-family:Courier;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;" /></text>
    <text
       xml:space="preserve"
       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:9.8777771px;line-height:6.61458302px;font-family:Calibri;-inkscape-font-specification:'Calibri, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
       x="23.8125"
       y="207.41963"
       id="text24"><tspan
         sodipodi:role="line"
         id="tspan22"
         x="23.8125"
         y="207.41963"
         style="stroke-width:0.26458332">ABCD</tspan></text>
    <text
       xml:space="preserve"
       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:9.8777771px;line-height:6.61458302px;font-family:Calibri;-inkscape-font-specification:'Calibri, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
       x="46.302082"
       y="207.41965"
       id="text28"><tspan
         sodipodi:role="line"
         id="tspan26"
         x="46.302082"
         y="207.41963"
         style="stroke-width:0.26458332">EFGH</tspan></text>
    <text
       xml:space="preserve"
       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:9.8777771px;line-height:6.61458302px;font-family:Calibri;-inkscape-font-specification:'Calibri, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
       x="67.657738"
       y="207.41963"
       id="text32"><tspan
         sodipodi:role="line"
         id="tspan30"
         x="67.657738"
         y="207.41963"
         style="stroke-width:0.26458332">IJKLMN</tspan></text>
    <text
       xml:space="preserve"
       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:9.8777771px;line-height:6.61458302px;font-family:Calibri;-inkscape-font-specification:'Calibri, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
       x="46.680061"
       y="199.67113"
       id="text36"><tspan
         sodipodi:role="line"
         id="tspan34"
         x="46.302082"
         y="199.67113"
         style="stroke-width:0.26458332">EF</tspan></text>
    <text
       xml:space="preserve"
       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:9.8777771px;line-height:6.61458302px;font-family:Calibri;-inkscape-font-specification:'Calibri, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
       x="67.846725"
       y="192.86755"
       id="text40"><tspan
         sodipodi:role="line"
         id="tspan38"
         x="67.657738"
         y="192.86755"
         style="stroke-width:0.26458332">IJKL</tspan></text>
  </g>
</svg>

很明显我用的是Inkscape,但你可以理解这个想法。这里没有什么不能用Python实现的。

0

我不太确定你想做什么,所以我会重复一下我认为你在说什么。

你有一个字符串(A -> T?),它代表一个任意的蛋白质(我们称之为X),每个字母对应着20种氨基酸中的一种。

你还有一个表格,它有两列控制和疾病,并且每个列中的元素都是按顺序排列的,但必须与X的序列对齐。你没有询问如何执行对齐,而对齐是一个完全不同的问题,因此我将专注于数据的可视化。

你想要将控制和疾病的X对齐序列放在X的上方进行视觉比较。

你真正有三个选择。

  • 使用matplotlib的文本功能,在执行匹配后将文本加载到文本对象中以显示(这可能是我提出的选项中最困难的)

  • 使用Python QT界面,并使用文本框进行相同操作(您将获得自动滚动功能)(您可以使用QT设计师轻松完成此操作),然后使用{{link3:setHtml}}并在文本周围使用HTML格式设置适当的颜色。此外,您还可以使用Tkinter并执行类似操作。

  • 最简单的解决方案是创建一个文本文件,其中包含您想要的内容,虽然您放弃了着色,但您可以更轻松地创建与X氨基酸长度相同的数组,并在其中设置单个字符,然后将所有内容写入文件中,在那里,如果使用统一的文本大小字体,您可以看到氨基酸对齐的位置。

如果您使用HTML来显示,也可以在HTML页面中显示此内容,但是这样您需要更多的工作来创建可滚动区域(但您可以为文本着色),这将不再是Python。

谢谢您的建议。我在考虑可能需要使用QT界面和Tkinter。今晚我会更深入地研究对齐情况,并看看这些选项各自的优缺点。 - Alex Nesta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接