如何在matplotlib中绘制带箭头的轴

0s7z1bwu  于 2023-08-06  发布在  其他
关注(0)|答案(2)|浏览(207)

我想实现以下三点:

  • 在x轴和y轴上添加箭头
  • 仅显示使用的值
  • 为坐标添加标签

此时此刻的代码:

x = [9, 8, 11, 11, 14, 13, 16, 14, 14]
y = [9, 16, 15, 11, 10, 11, 10, 8, 8]
fig = plt.figure(figsize=(7,7), dpi=300)
axes = fig.add_axes([0,1,1,1])

axes.set_xlim(0, 17)
axes.set_ylim(0, 17)

axes.invert_yaxis()

axes.scatter(x, y, color='green')
axes.vlines(x, 0, y, linestyle="dashed", color='green')
axes.hlines(y, 0, x, linestyle="dashed", color='green')
axes.spines.right.set_visible(False)
axes.spines.bottom.set_visible(False)

plt.show()

字符串
目视检查:


的数据
并绘制出我要实现的

q3aa0525

q3aa05251#

您可以通过将三角形形状的点叠加在棘的末端来绘制箭头。
您需要利用一些transforms,但是您也可以通过手动向Axes对象添加文本来创建标签。
标记每个坐标可以通过axes.annotate完成,但您需要手动指定每个注解的位置,以确保它们不会与线或其他注解重叠。

import matplotlib.pyplot as plt
from matplotlib.ticker import FixedLocator

x = [9, 8, 11, 11, 14, 13, 16, 14, 14]
y = [9, 16, 15, 11, 10, 11, 10, 8, 8]

fig = plt.figure(figsize=(7,7), dpi=300)
axes = fig.add_axes([.05,.05,.9,.9])

# Plots the data
axes.scatter(x, y, color='green')
axes.vlines(x, 0, y, linestyle="dashed", color='green')
axes.hlines(y, 0, x, linestyle="dashed", color='green')

axes.set_xlim(0, 17)
axes.set_ylim(0, 17)
axes.set_xticks(x)
axes.set_yticks(y)
axes.invert_yaxis()

# Move ticks to top side of plot
axes.xaxis.set_tick_params(
    length=0, bottom=False, labelbottom=False, top=True, labeltop=True
)
axes.xaxis.set_tick_params(length=0)

# Add arrows to the spines by drawing triangle shaped points over them
axes.plot(1, 1, '>k', transform=axes.transAxes, clip_on=False)
axes.plot(0, 0, 'vk', transform=axes.transAxes, clip_on=False)
axes.spines[['bottom', 'right']].set_visible(False)

# Add labels for 0, F_1 and F_2
from matplotlib.transforms import offset_copy
axes.text(
    0, 1, s='0', fontstyle='italic', ha='right', va='bottom',
    transform=offset_copy(axes.transAxes, x=-5, y=5, fig=fig, units='points'),
)
axes.text(
    1, 1, s='$F_1$', fontstyle='italic', ha='right', va='bottom',
    transform=offset_copy(axes.transAxes, x=0, y=5, fig=fig, units='points'),
)
axes.text(
    0, 0, s='$F_2$', fontstyle='italic', ha='right',
    transform=offset_copy(axes.transAxes, x=-5, y=0, fig=fig, units='points'),
)

# Add labels at each point. Leveraging the alignment of the text
# AND padded offset.
lc = ('top', 'center', 0, -5)
ll = ('top', 'right', -5, -5)
lr = ('top', 'left', 5, -5)
ur = ('bottom', 'left', 5, 5)
alignments = [lc, lc, lc, ll, lc, ll, lc, ur, lr]
for i, (xc, yc, (va, ha, padx, pady)) in enumerate(zip(x, y, alignments)):
    axes.annotate(
        xy=(xc, yc), xytext=(padx, pady),
        text=f'$F(x_{i})$', ha=ha, va=va, textcoords='offset points')

plt.show()

字符串


的数据

iyfjxgzm

iyfjxgzm2#

添加

axes.plot(1, 0, ">k", transform=axes.get_yaxis_transform(), clip_on=False)  
axes.plot(0, 0, "vk", transform=axes.get_xaxis_transform(), clip_on=False)

字符串
会为你做的。这基本上只是一个标记的作弊图。
也有
from mpl_toolkits.axisartist.axislines.AxesZero允许

for direction in ["xzero", "yzero"]:
    # adds arrows at the ends of each axis
    ax.axis[direction].set_axisline_style("-|>")


但是他们不能处理你的默认设置中的反向y轴。

相关问题