Matplotlib:在对数 - 对数图中绘制一个垂直箭头

时间:2012-08-02 16:44:30

标签: python matplotlib

我无法在下面的对数 - 日志图中绘制一个简单的垂直箭头:

#!/usr/bin/python2

import matplotlib.pyplot as plt
import matplotlib as mpl

plt.yscale('log')
plt.xscale('log')
plt.ylim((1e-20,1e-10))
plt.xlim((1e-12,1))

plt.arrow(0.00006666, 1e-20, 0, 1e-8 - 1e-20, length_includes_head=True)

plt.savefig('test.pdf')

它没有表现出来。从文档中可以看出,所有参数(如宽度,高度等)都与轴的比例相关。这非常违反直觉。我尝试使用axartist包的twin()在我的顶部定义一个带有限制(0,1)(0,1)的轴,以便更好地控制箭头的参数,但我无法弄清楚在主要轴上有一个完全独立的轴。

有什么想法吗?

3 个答案:

答案 0 :(得分:5)

Subplots方法

创建子图后,请执行以下操作

  • 对齐职位
  • 使用set_axis_off()关闭轴(刻度,标签等)
  • 画出箭头!

所以有几行可以找到你想要的东西!

E.g。

#!/usr/bin/python2

import matplotlib.pyplot as plt

hax = plt.subplot(1,2,1)
plt.yscale('log')
plt.xscale('log')
plt.ylim((1e-20,1e-10))
plt.xlim((1e-12,1))

hax2 = plt.subplot(1,2,2)
plt.arrow(0.1, 1, 0, 1, length_includes_head=True)

hax.set_position([0.1, 0.1, 0.8, 0.8])
hax2.set_position([0.1, 0.1, 0.8, 0.8])

hax2.set_axis_off()

plt.savefig('test.pdf')

重新调整数据

或者,一种可能更简单的方法,虽然轴标签可能很棘手,但是要重新缩放数据。

即。

import numpy 

# Other import commands and data input

plt.plot(numpy.log10(x), numpy.log10(y))) 

不是一个很好的解决方案,但如果你能处理刻度标签,那么结果不错!

答案 1 :(得分:5)

我一直在寻找这个问题的答案,并找到了一个有用的答案!您可以将任何“mathtext”字符(matplotlib的LaTeX版本)指定为标记。尝试: plt.plot(x,y,'ko',marker = r'$ \ downarrow $',markersize = 20)

这将在位置(x,y)处绘制一个向下指向的黑色箭头,该箭头在任何绘图上都很好(甚至是log-log)。 请参阅:matplotlib.org/users/mathtext.html#mathtext-tutorial了解更多可以使用的符号。

答案 2 :(得分:2)

我知道这个帖子已经死了很长时间了,但我认为发布我的解决方案可能对其他任何试图找出如何有效地在对数比例图上绘制箭头的人有所帮助。

作为其他人已经发布的内容的替代方法,您可以使用transformation object输入不在原始轴的比例中但在“轴坐标”的(线性)比例中的箭头坐标。我所说的轴坐标是那些通过[0,1](垂直范围)归一化到[0,1](水平范围)的那些,其中点(0,0)将是左下角和点(1,1)将是右上角,依此类推。然后你可以简单地通过以下方式包含一个箭头:

plt.arrow(0.1, 0.1, 0.9, 0.9, transform=plot1.transAxes, length_includes_head=True)

这会给出一个箭头,该箭头从左下角到右上角(其中plot1是子图名称),在图的水平和垂直范围的4/5上对角线。

如果你想一般这样做,可以为箭头指定日志空间中的精确坐标(x0,y0)(x1,y1),如果你编写两个函数{{{{{{ 1}}和fx(x)从原始坐标转换为这些“轴”坐标。我举了一个例子,说明如何修改OP发布的原始代码以实现下面的内容(不包括代码产生的图像,我还没有所需的声誉)。

fy(y)