Как округлить соединение для шипов оси Matplotlib

avatar
Ethan
19 ноября 2021 в 22:58
168
1
3

Это довольно простой вопрос. Я работаю над созданием фигуры Matplotlib с несколькими осями вставки.

Я удалил засечки так, чтобы выступы каждой из осей вставки сходились под углом 90 градусов. Однако при добавлении легенды к этому рисунку добавляется объект легенды со слегка закругленными соединениями стержня для каждого «ребра» объекта легенды.

Есть ли простой способ получить аналогичный эффект для шипов оси вставки или оси в целом?

Мой код:

fig, e = plt.subplots(figsize=(10, 5))
    
a = e.inset_axes([.1, .1, .1, .2])
b = e.inset_axes([.3, .1, .1, .2])

for ax in [a, b]:
    
    ax.set_yticks([])
    ax.set_xticks([])

Текущий выход:

enter image description here

Желаемый результат:

enter image description here

Источник
Håkon Hægland
19 ноября 2021 в 23:17
0

Можете ли вы показать код, который вы использовали для добавления легенды?

Ethan
19 ноября 2021 в 23:22
0

@HåkonHægland Код легенды по умолчанию — ax.legend().

JohanC
19 ноября 2021 в 23:43
0

Объект легенды не имеет шипов. Он имеет что-то вроде FancyBboxPatch. предыдущий вопрос остался без ответа, что, вероятно, означает, что простого пути не существует.

Ethan
19 ноября 2021 в 23:45
0

@JohanC Интересно. Спасибо за это разъяснение.

Ответы (1)

avatar
JohanC
20 ноября 2021 в 00:01
4

Идея состоит в том, чтобы скрыть шипы и нарисовать FancyBboxPatch в том же месте. Параметр clip_on=False позволяет избежать неправильного обрезания блока.

Назначение закругленного прямоугольника ax_a.patch делает обрезку как основной оси, так и объектов внутри оси вставки.

Вот пример кода, изменяющий левую ось врезки.

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

fig, ax_e = plt.subplots(figsize=(10, 5))

ax_a = ax_e.inset_axes([.1, .1, .1, .2])
ax_b = ax_e.inset_axes([.3, .1, .1, .2])

for ax in [ax_a, ax_b]:
    ax.set_yticks([])
    ax.set_xticks([])
for s in ax_a.spines:
    ax_a.spines[s].set_visible(False)
p_bbox = FancyBboxPatch((0, 0), 1, 1,
                        boxstyle="round,pad=-0.0040,rounding_size=0.2",
                        ec="black", fc="white", clip_on=False, lw=1,
                        mutation_aspect=1,
                        transform=ax_a.transAxes)
ax_a.add_patch(p_bbox)
ax_a.patch = p_bbox

t = np.linspace(0, 2 * np.pi, 100)
ax_a.plot(np.sin(3 * t), np.sin(4 * t))  # drawing some curve
ax_a.plot([-2, 2], [-2, 2], 'g', lw=10, alpha=0.3)  # diagonal line to check the clipping in the corners
ax_a.set_xlim(-1.1, 1.1)
ax_a.set_ylim(-1.1, 1.1)

ax_e.set_facecolor('tomato')  # show the clipping around the inset axes

plt.show()

inset axis with rounded corners