修改circos图像的最简洁方法

时间:2015-07-24 14:40:38

标签: python-2.7 matplotlib reportlab circos

我想就以下方面提出一些建议: 我用circos(dna数据)创建了一个图像。我想通过在图中间绘制基因名称来注释这些数据,并用箭头显示第一个基因的起始位置。 (此处的示例输出文件:http://www.nature.com/ncomms/2015/150122/ncomms6973/images/ncomms6973-f3.jpg

这是管道的一部分,因此需要创建数千个图像。这听起来像基本功能,但有没有可用的软件(在开放许可下)这样做?

我认为最好的方法是在'some'包中加载图像,并使用生成的图像作为画布来绘制其他内容。

有人可以提供关于如何做这样的事情的任何提示吗? 我试过谷歌搜索,但这个问题似乎广泛用于谷歌搜索。

除了circos,我正在使用matplotlib和reportlab,所以我希望其中一个可行。

我理解这不是一个'纯粹的'编程问题(在3 ... 2 .. 1中投票)。

编辑:我想绘制两件事。 1)图像中心的文本。 2)在圆圈中间指向右侧的弯曲箭头。

2 个答案:

答案 0 :(得分:2)

可以通过创建极坐标子图,然后使用ax.bar方法生成此类图像:http://matplotlib.org/examples/pie_and_polar_charts/polar_bar_demo.html

通过调整它,你可以做类似的事情:

import numpy as np
import matplotlib.pyplot as plt


N = 40
theta = np.linspace(0.0, 2 * np.pi, N, endpoint=False)
radii = np.random.uniform(-20,20,N)
width = 2*np.pi / N

ax = plt.subplot(111, polar=True)
ax.grid(False)
bars1 = ax.bar(theta, radii, width=width, bottom=40.0) 
bars2 = ax.bar(theta, radii, width=width, bottom=100.0)


# Use custom colors and opacity
for r, bar in zip(radii, bars1):
    bar.set_facecolor( 'r' if r>0 else 'g' )
    bar.set_alpha(0.5)

plt.show()

fig.savefig("figure_1.png")

example

matplotlib gallery中提供了很多示例: http://matplotlib.org/gallery.html

现在,如果你真的拥有那么多复杂的图像,matplotlib可能很难实现快速图形计算。

但是您保存了这些图像,您可以加载它们并处理它们。这可能会更快:

例如,我将前一个保存为png,然后我可以使用scipy.misc.imread加载它(请注意,这可以使用任何jpeg / png / etc ..图像,甚至一个不能从matplotlib生成),绘制它使用imshow,然后使用通常的plot绘制它,您只需要注意使用正确的坐标:

import numpy as np
import matplotlib.pyplot as plt
import scipy.misc

fig = plt.figure()
ax = fig.add_subplot(111)
ax.grid(False)
img = scipy.misc.imread("figure_1.png")
ax.imshow(img)

ax.plot([400,500],[300,200],'k', linewidth=4)

plt.show()

enter image description here

答案 1 :(得分:0)

我喜欢你最干净的方式" - 最好的方法是:

  • 自行修改SVG文件

Circos的输出文件是SVG或png。所以我们选择SVG。

  1. 在中心添加文字:只需在svg文件中添加文字标签,如下所示:

      

    <text x="1500" y="1500">Here is your text in center</text>

  2. 按路径和文字路径绘制

    路径是svg的强大功能。您可以访问https://developer.mozilla.org/en-US/docs/Web/SVG/Element/textPath了解详情。