Я хочу нарисовать прямоугольник в matplotlib и хочу, чтобы показывался только верхний край. Я попробовал нарисовать линию поверх прямоугольника, чтобы получилось, но результат меня не удовлетворил. Вот мой код:
import matplotlib.pyplot as plt
from matplotlib.axes import Axes
from matplotlib.figure import Figure
from matplotlib.patches import Rectangle
LIM = 5
def configure_plot(lim: float, **kwargs) -> tuple[Figure, Axes]:
fig: Figure
ax: Axes
fig, ax = plt.subplots(**kwargs)
ax.axis("equal")
ax.set_axis_off()
ax.set_xlim(-lim, lim)
ax.set_ylim(-lim, lim)
fig.tight_layout()
return fig, ax
def main() -> None:
fig: Figure
ax: Axes
fig, ax = configure_plot(LIM)
width = 8
height = 3.5
color = "tab:blue"
rect = Rectangle(
(-width / 2, -height),
width,
height,
facecolor=color,
alpha=0.8,
linewidth=3,
)
ax.add_patch(rect)
ax.plot([-width / 2, width / 2], [0, 0], color=color)
plt.show()
if __name__ == "__main__":
main()
Это дает мне такой вывод:
Это почти тот результат, который я ищу, но линия края немного выходит за углы прямоугольника, что, на мой взгляд, делает его хуже. Я мог бы поиграть с конечными точками линии, чтобы сократить ее и подогнать по размеру, но это не похоже на идеальное решение. Есть ли способ нарисовать прямоугольник и только один из его краев в matplotlib?
Вы можете использовать Многоугольники, в зависимости от того, чего вы пытаетесь достичь, это позволяет легко добавлять дополнительные края, просто расширяя фрагмент (coords[start:end]
)
from matplotlib.patches import Polygon
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
width = 8
height = 3.5
x,y = (-width / 2, -height/2)
coord = [
[x, y], # bottom-left
[x+width, y], # bottom-right
[x+width, y+height], # top-right
[x, y+height], # top-left
]
polygon = Polygon(coord, closed=True, facecolor='r')
polygon2 = Polygon(coord[2:4], fc='none', ec='blue', lw=3)
ax.add_patch(polygon)
ax.add_patch(polygon2)
plt.axis('equal')
plt.ylim(-5, 5)
plt.xlim(-5, 5)
plt.show()
Что приводит к этому:
Вы можете установить CapStyle для строки ax.plot
на butt
(вместо значения по умолчанию, которое равно projecting
). Для этого вы можете использовать кварг solid_capstyle
.
Чтобы продемонстрировать это, я увеличил толщину линии, чтобы различия были более очевидными:
Solid_capstyle = 'проецирование'
ax.plot([-width / 2, width / 2], [0, 0], color=color,
solid_capstyle='projecting', linewidth=5)
Solid_capstyle = 'попка'
ax.plot([-width / 2, width / 2], [0, 0], color=color,
solid_capstyle='butt', linewidth=5)
Нет, но вы можете просто установить ширину линии на 0, поскольку цвет грани и края совпадают.