matplotlib 自定义inset_zoom连接线

0mkxixxg  于 2023-10-24  发布在  其他
关注(0)|答案(1)|浏览(128)

嘿,我是新来的,也是用Python编码和绘图的新手,
我尝试使用matplolib的inset_zoom功能,但在自定义连接线时遇到了一些困难。我已经设法更改了连接线的线型和线宽。现在我试图通过设置set.visible()为True或False来更改默认绘制线的选择。但不是完全不显示set False连接线,而且我更喜欢它,如果线没有连接矩形的相同角,而是平行的边角(见下文)。
情节是为我的学士学位论文,我有点运行出来的时间,所以提前感谢您的帮助!
下面是一个代码片段:

#inset axes
x1,x2,y1,y2 = 0, 0.2, 0, 0.2 # subregion of origanal image
axin1 = ax[1].inset_axes([0.56, 0.04, 0.4, 0.4], xlim=(x1,x2), ylim=(y1,y2), xticks=[], yticks=[], xticklabels=[], yticklabels=[])

axin1.plot(x_H2_real_test, x_H2_pred_test, '.', markersize = 4)
axin1.plot(x_NH3_real_test, x_NH3_pred_test, '.', markersize = 4)
axin1.plot([0, 1], [0, 1], "-", color = 'crimson',lw=1,zorder=1 )
axin1.plot([bounds[0],bounds[1]], [bounds[0] * 1.1, bounds[1] * 1.1], "k--", lw=1)
axin1.plot([bounds[0],bounds[1]], [bounds[0] * 0.9, bounds[1] * 0.9], "k--", lw=1)

box, c1 = ax[1].indicate_inset_zoom(axin1, edgecolor="black", alpha=1,lw=0.7)
c1[0].set_visible(False)
c1[1].set_visible(True)
c1[2].set_visible(True)
c1[3].set_visible(False)
ax[1].indicate_inset_zoom(axin1, edgecolor="black", alpha=1,lw=0.7)
plt.setp([c1[:]], linestyle=":", lw=0.7)

#plt.legend()
#fig.suptitle("Parity Plot")
plt.tight_layout()
plt.show()

当前位置:x1c 0d1x
读取线标记了我希望连接器线连接的位置:

t3psigkw

t3psigkw1#

一种选择是使用一些ConnectionPatch示例创建您自己的连接,因为您可以精确地控制它们的绘制位置。
由于我们不再需要原始的连接,我们现在可以使用indicate_inset而不是indicate_inset_zoom;为此,我们需要定义自己绘制的框的边界,我们可以使用插入轴的x和y限制来完成。
以你的例子(没有数据绘图部分)为例,这个方法看起来像这样:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import ConnectionPatch

fig, ax = plt.subplots(ncols=2)

#inset axes
x1,x2,y1,y2 = 0, 0.2, 0, 0.2 # subregion of origanal image
axin1 = ax[1].inset_axes([0.56, 0.04, 0.4, 0.4], xlim=(x1,x2), ylim=(y1,y2), xticks=[], yticks=[], xticklabels=[], yticklabels=[])

rect = (x1, y1, x2 - x1, y2 - y1)

box = ax[1].indicate_inset(rect, edgecolor="black", alpha=1,lw=0.7)

cp1 = ConnectionPatch(xyA=(0.2, 0.0), xyB=(0, 0), axesA=ax[1], axesB=axin1,
                      coordsA="data", coordsB="axes fraction", lw=0.7, ls=":")
cp2 = ConnectionPatch(xyA=(0.2, 0.2), xyB=(0, 1), axesA=ax[1], axesB=axin1,
                      coordsA="data", coordsB="axes fraction", lw=0.7, ls=":")

ax[1].add_patch(cp1)
ax[1].add_patch(cp2)

plt.tight_layout()
plt.show()

其产生:

相关问题