gpt4 book ai didi

python - 如何在 matplotlib 的主图外绘制箭头和矩形(用于蛋白质 sec 结构)?

转载 作者:行者123 更新时间:2023-12-02 02:40:44 24 4
gpt4 key购买 nike

我试图在 matplotlib 中的 y 轴旁边绘制箭头和矩形(以表示蛋白质二级结构),如下所示:

enter image description here

来自 here我得到了箭头部分,但我不知道如何在 y 轴之外绘制它。另外,除了箭头之外,有没有办法绘制矩形?代码和输出如下:

import matplotlib.patches as mpatches
import matplotlib.pyplot as plt
x_tail = 0.0
y_tail = -0.1
x_head = 0.0
y_head = 0.9
dx = x_head - x_tail
dy = y_head - y_tail
fig, axs = plt.subplots(nrows=2)
arrow = mpatches.FancyArrowPatch((x_tail, y_tail), (dx, dy),
mutation_scale=50,
transform=axs[0].transAxes)
axs[0].add_patch(arrow)

arrow = mpatches.FancyArrowPatch((x_tail, y_tail), (dx, dy),
mutation_scale=100,
transform=axs[1].transAxes)
axs[1].add_patch(arrow)
axs[1].set_xlim(0, 1)
axs[1].set_ylim(0, 1)

enter image description here

最佳答案

看起来原来的方法有点困惑。

虽然您可以通过 mpatch.Rectangle 绘制矩形,但我认为通过 FancyArrowPatch 绘制矩形更容易。这使得它们的行为和缩放相似,这对于设置宽度很有趣。同样,垂直线也是使用 FancyArrowPatch 绘制的。

对于定位,it seems你可以只给出 (tail_x, tail_y)head_x, head_y。通过arrowstyle=可以设置视觉尺寸。从样式中省略 head_length= 似乎允许看起来像矩形的箭头。对于着色,有facecolor=edgecolor=。还有 color=,它同时处理 facecoloredgecolor

arrow1.set_clip_on(False) 允许在空白处绘制箭头。其他函数可以有一个 clip_on=False 参数。需要 zorder= 才能在将一条线绘制在另一条线之上时使正确的线可见。

这是一些示例代码。矩形被绘制了两次,因此垂直线不会通过影线显示。现在 x 在 'axis coordinates' 中定义和标准数据坐标中的 y。 “轴”坐标从 0(通常绘制 y 轴的左边界)到 1(右边界)。将 x 设置为 -0.1 表示在 y 轴左侧 10%。

import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
import matplotlib.transforms as mtransforms

x0 = -0.1

arrow_style="simple,head_length=15,head_width=30,tail_width=10"
rect_style="simple,tail_width=25"
line_style="simple,tail_width=1"

fig, ax = plt.subplots()

# the x coords of this transformation are axes, and the y coord are data
trans = mtransforms.blended_transform_factory(ax.transAxes, ax.transData)

y_tail = 5
y_head = 15
arrow1 = mpatches.FancyArrowPatch((x0, y_tail), (x0, y_head), arrowstyle=arrow_style, transform=trans)
arrow1.set_clip_on(False)
ax.add_patch(arrow1)

y_tail = 40
y_head = 60
arrow2 = mpatches.FancyArrowPatch((x0, y_tail), (x0, y_head), arrowstyle=arrow_style, facecolor='gold', edgecolor='black', linewidth=1, transform=trans)
arrow2.set_clip_on(False)
ax.add_patch(arrow2)

y_tail = 20
y_head = 40
rect_backgr = mpatches.FancyArrowPatch((x0, y_tail), (x0, y_head), arrowstyle=rect_style, color='white', zorder=0, transform=trans)
rect_backgr.set_clip_on(False)
rect = mpatches.FancyArrowPatch((x0, y_tail), (x0, y_head), arrowstyle=rect_style, fill=False, color='orange', hatch='///', transform=trans)
rect.set_clip_on(False)
ax.add_patch(rect_backgr)
ax.add_patch(rect)

line = mpatches.FancyArrowPatch((x0, 0), (x0, 80), arrowstyle=line_style, color='orange', transform=trans, zorder=-1)
line.set_clip_on(False)
ax.add_patch(line)

ax.set_xlim(0, 30)
ax.set_ylim(0, 80)
plt.show()

example plot

关于python - 如何在 matplotlib 的主图外绘制箭头和矩形(用于蛋白质 sec 结构)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59670812/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com