python - 如何用matplotlib制作 'fuller'轴箭头

标签 python matplotlib

我有以下代码:

from mpl_toolkits.axes_grid.axislines import SubplotZero
from matplotlib.transforms import BlendedGenericTransform
import matplotlib.pyplot as plt
import numpy

if 1:
    fig = plt.figure(1)
    ax = SubplotZero(fig, 111)
    fig.add_subplot(ax)

    ax.axhline(linewidth=1.7, color="black")
    ax.axvline(linewidth=1.7, color="black")

    plt.xticks([1])
    plt.yticks([])

    ax.text(0, 1.05, 'y', transform=BlendedGenericTransform(ax.transData, ax.transAxes), ha='center')
    ax.text(1.05, 0, 'x', transform=BlendedGenericTransform(ax.transAxes, ax.transData), va='center')

    for direction in ["xzero", "yzero"]:
        ax.axis[direction].set_axisline_style("-|>")
        ax.axis[direction].set_visible(True)

    for direction in ["left", "right", "bottom", "top"]:
        ax.axis[direction].set_visible(False)

    x = numpy.linspace(-0.5, 1., 1000)
    ax.plot(x, numpy.sin(x*numpy.pi), linewidth=1.2, color="black")

    plt.show()

生成以下图像:

graph

与实际图表相比,轴箭头看起来有些残留。我如何将它们的尺寸放大一点,以便它们在轴的宽度方面看起来正常。

此外 - 这里很难看清,但箭头的内部是蓝色的 - 如何将其更改为黑色?

最佳答案

我的解决方案与 nebffa 的解决方案基本相同。我创建了一个最小示例,用于计算 y 轴的箭头宽度和长度以匹配为 x 轴指定的箭头宽度和长度。我希望这可能对其他人有所帮助。

import pylab as pl

fig = pl.figure()
ax = fig.add_subplot(111)

x = pl.arange(-5,5,0.1)
ax.plot(x, x**2-8.8)

xmin, xmax = ax.get_xlim()
ymin, ymax = ax.get_ylim()

# removing the default axis on all sides:
for side in ['bottom','right','top','left']:
    ax.spines[side].set_visible(False)

# removing the axis ticks
pl.xticks([]) # labels
pl.yticks([])
ax.xaxis.set_ticks_position('none') # tick markers
ax.yaxis.set_ticks_position('none')

# wider figure for demonstration
fig.set_size_inches(4,2.2)

# get width and height of axes object to compute
# matching arrowhead length and width
dps = fig.dpi_scale_trans.inverted()
bbox = ax.get_window_extent().transformed(dps)
width, height = bbox.width, bbox.height

# manual arrowhead width and length
hw = 1./20.*(ymax-ymin)
hl = 1./20.*(xmax-xmin)
lw = 1. # axis line width
ohg = 0.3 # arrow overhang

# compute matching arrowhead length and width
yhw = hw/(ymax-ymin)*(xmax-xmin)* height/width
yhl = hl/(xmax-xmin)*(ymax-ymin)* width/height

# draw x and y axis
ax.arrow(xmin, 0, xmax-xmin, 0., fc='k', ec='k', lw = lw,
         head_width=hw, head_length=hl, overhang = ohg,
         length_includes_head= True, clip_on = False)

ax.arrow(0, ymin, 0., ymax-ymin, fc='k', ec='k', lw = lw,
         head_width=yhw, head_length=yhl, overhang = ohg,
         length_includes_head= True, clip_on = False)

# clip_on = False if only positive x or y values.

pl.savefig('arrow_axis.png', dpi = 300)

产生:

enter image description here

关于python - 如何用matplotlib制作 'fuller'轴箭头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17646247/

相关文章:

python - SQLite3 选择过去 24 小时内插入到 Flask 中的条目

python - Matplotlib 半黑半白圆

python - Matplotlib 绘制多条线不起作用

python - 基于第三列的 pandas 数据框颜色的 Seaborn 散点图

python - 为类(class)成员设置值时如何防止错别字?

python - 当表格从可变行开始时,Pandas 读取 Excel

python - 解决此示例的更有效方法?

python - 需要登录的装饰器在 django 中无法正常工作

python - matplotlib - 多边形边缘的半径 - 这可能吗?

python - 你如何在 matplotlib 中设置绘图的外部 bg 颜色