
< /p>
Я реализовал это с помощью matplotlib patches.FancyArrow для серых стрелок расшифровки и patches.Rectangle для рисования цветных доменов поверх стрелок. Однако, как вы могли заметить, эти прямоугольники доменов не совсем совпадают со стрелками, лежащими в основе транскрипции. Например в CDS23 совершенно очевидно, что пурпурные прямоугольники на 1 пиксель выше лежащей под ними серой стрелки. Однако координаты Y для этих элементов одинаковы.
Я не уверен, как можно это предотвратить. Я попробовал установить antialiased=False, Edgecolor="none" и увеличить DPI. Обратите внимание, что этот рисунок нарисован с помощью рисунка (dpi=300) (и сохранен с помощью saveplot(dpi=600)). Тем не менее, эти различия в пикселях видны. При разрешении 100 это очень заметно.
Есть ли способ визуализировать это без этих артефактов?
Это моя функция построения графиков и функция для генерации некоторые данные:
import numpy as np
import matplotlib.patches as patches
import matplotlib.pyplot as plt
import random
import matplotlib.patheffects as path_effects
def get_data(
genome_size: int,
p_start=0.01,
p_end=0.05,
p_dom=0.1,
dom_size=30,
dom_types=("catal", "transp", "reg"),
):
n_cdss = np.random.poisson(p_start * genome_size * 2, 1)[0]
starts = random.choices(range(genome_size), k=n_cdss)
cdslens = np.random.geometric(p=p_end, size=len(starts))
orients = np.random.uniform(0, 1, size=len(starts)) > 0.5
transcripts = []
cds_i = 0
for start, cdslen, orient in zip(starts, cdslens, orients):
stop = start + cdslen
if stop < genome_size:
domains = []
coord = start
while coord < stop - dom_size:
if random.uniform(0, 1) 0 else point_size / 2, 0),
textcoords="offset points",
va="center",
ha="right" if y > 0 else "left",
fontsize=5,
)
txt.set_path_effects(text_outline)
arrow = patches.FancyArrow(
x=x0,
y=y,
dx=x1 - x0,
dy=0,
color=transcr_color,
width=arrow_width,
head_width=arrow_width,
length_includes_head=False,
head_length=head_length,
zorder=20,
edgecolor="none",
)
ax.add_patch(arrow)
for dom_label, dom_x0, dom_x1 in cds_doms:
rect = patches.Rectangle(
xy=(dom_x0, y - arrow_width / 2),
width=dom_x1 - dom_x0,
height=arrow_width,
color=color_map.get(dom_label, default_color),
zorder=21,
edgecolor="none",
)
ax.add_patch(rect)
termbbox = {"boxstyle": "round", "fc": "white"}
ax.annotate(
text="5'",
xy=(xlims[0], 0),
xytext=(-2 * point_size, 0),
textcoords="offset points",
va="center",
ha="right",
bbox=termbbox,
fontsize=5,
)
ax.annotate(
text="3'",
xy=(xlims[1], 0),
xytext=(2 * point_size, 0),
textcoords="offset points",
va="center",
ha="left",
bbox=termbbox,
fontsize=5,
)
plt.show()
color_map = {
"catal": "#fe218b",
"transp": "#21b0fe",
"reg": "#fed700",
}
transcripts, genome_range = get_data(genome_size=1200, p_end=0.01)
transcripts_plot(
genome_range=genome_range, transcripts=transcripts, color_map=color_map
)
Подробнее здесь: https://stackoverflow.com/questions/791 ... matplotlib
Мобильная версия