【问题标题】:Python and Matplotlib: characters as the x axisPython 和 Matplotlib:字符作为 x 轴
【发布时间】:2017-10-19 00:26:04
【问题描述】:

嗨 Stack Overflow 社区。我想我正在尝试用 matplotlib 编写不可能的代码,所以如果有更适合我的不同 python 库,请告诉我!

我有一个蛋白质(蛋白质 x)的完整氨基酸序列(在图像中用大写字母表示)。这将是我的 x 轴。

我有两个 Excel 列:疾病和控制。这些列包含整个蛋白质 x 的氨基酸序列的一部分。有时有多个命中,其中疾病或对照列将包含两个相同的蛋白质 x 氨基酸部分。我希望将它们堆叠在一起,这样人们就可以看到疾病和控制对蛋白质 x 有多少打击。

令人困惑?抱歉,这是我使用 powerpoint 想出的示例。

氨基酸比较

黑色文本是参考序列。紫色是控制。粉红色是病。现在有意义吗?

我需要用一个巨大的数据集来做这件事,所以不,我不想“只用几个小时的 powerpoint”。我也想用我选择的任何参考序列来做。

我不是要求别人为我做我的工作。我需要有人指出我正确的方向。有专门的图书馆吗?我应该将所有内容都转换为数字然后重新标记为文本吗?

谢谢,我很感激任何建议。

【问题讨论】:

  • 嗨,亚历克斯。如果您需要对大型数据集进行序列比对分析,您可以尝试使用 Biopython 生物信息学包 (biopython.org/wiki/AlignIO) 进行序列比对。对于可视化,我不确定 Python 是否有专为满足您的特定需求而设计的工具。 Matplotlib 是一个非常灵活的工具,可用于重现您的示例图,但拥有示例数据和您迄今为止尝试过的代码会很有帮助。
  • 您的“疾病”和“控制”列到底是做什么的?除非您遗漏了巨大的比对细节,或者列的大小与 X 的长度相同,并且与其中的每个氨基酸一一对应,否则您所说的一切都没有意义。 @Brian,他不是在解释这些列与 X 的长度不是一对一的,而是它们自己的单个序列?
  • 感谢您迄今为止的帮助和建议。是的,我还需要弄清楚如何将疾病和控制列的每一行与蛋白质 x 的序列对齐。疾病和控制列的行包含长度在 5-15 个字母之间的序列,这些序列应该与蛋白质 x 的一部分完美对齐(这在图像中显示为紫色和粉红色)。我想我可以使用 biopython 做到这一点,但很难想象我将如何可视化对齐的数据。
  • 对于自定义图形,我有时会使用python以编程方式生成TikZ代码。不过,这可能会导致 pdf 文件很大。

标签: python pandas matplotlib bioinformatics


【解决方案1】:

使用脚本创建一个 SVG 图像,它是一个 XML 文本。我会处理一些更简单的事情!

假设你的目标是这个。

首先在每个会有一列字符串片段的地方打断大字符串,在这种情况下,在“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 做不到的

【讨论】:

    【解决方案2】:

    我不完全确定你想要做什么,所以我会重复我认为你在说的话。

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

    您还有一个,它有两列控制和疾病,列中的每个元素都是有序的,但必须与 X 的序列对齐。你没有问关于执行对齐的问题,对齐本身就是一个完全不同的问题,所以我将专注于数据的可视化。

    您想要获取 Control 和 Disease 的 X 对齐序列,并在 X 之上直观地比较它们。

    你真的有三个选择。

    • use matplotlib's text functionality 并在执行匹配后加载要显示的文本对象中的文本(可能是我提出的最困难的选项)

    • use python QT interface 并做同样的事情,但使用文本框(您将获得自动滚动功能)(您可以使用 QT 设计器轻松完成此操作)然后使用 setHtml 并在文本周围使用 html 格式得到适当的着色。另外你也可以use Tkinter 做类似的事情。

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

    如果您改为使用 HTML 来显示,您也可以在 HTML 页面中显示它,但是您必须做更多的工作来创建可滚动区域(但您可以为文本着色)并且这根本不再是 python。

    【讨论】:

    • 感谢您的建议。我在想我可能需要使用 QT 界面和 Tkinter。今晚我将更多地研究对齐情况,看看这些选项中的每一个是如何叠加的。
    猜你喜欢
    • 2011-11-25
    • 1970-01-01
    • 2018-11-15
    • 2018-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多