在Matplotlib中,制作图例(example_legend()
,下面)并不太坚韧,但我认为将标签放在正在绘制的曲线上(如example_inline()
,下面)更好。这可能非常麻烦,因为我必须手动指定坐标,而且,如果我重新格式化绘图,我可能必须重新定位标签。有没有办法在Matplotlib中自动生成曲线上的标签?能够以与曲线的Angular 相对应的Angular 定向文本的加分。
import numpy as np
import matplotlib.pyplot as plt
def example_legend():
plt.clf()
x = np.linspace(0, 1, 101)
y1 = np.sin(x * np.pi / 2)
y2 = np.cos(x * np.pi / 2)
plt.plot(x, y1, label='sin')
plt.plot(x, y2, label='cos')
plt.legend()
def example_inline():
plt.clf()
x = np.linspace(0, 1, 101)
y1 = np.sin(x * np.pi / 2)
y2 = np.cos(x * np.pi / 2)
plt.plot(x, y1, label='sin')
plt.plot(x, y2, label='cos')
plt.text(0.08, 0.2, 'sin')
plt.text(0.9, 0.2, 'cos')
5条答案
按热度按时间8nuwlpux1#
**更新:**用户cphyc已经为这个答案中的代码创建了一个Github仓库(参见here),并将代码捆绑到一个包中,可以使用
pip install matplotlib-label-lines
安装。漂亮的图片:
在
matplotlib
中,label contour plots非常容易(自动或通过鼠标单击手动放置标签)。目前还没有任何类似的功能可以以这种方式标记数据序列!可能有一些语义上的原因不包括这个功能,我错过了。无论如何,我已经写了下面的模块,它允许半自动绘图标签。它只需要
numpy
和标准math
库中的几个函数。说明
labelLines
函数的默认行为是沿着x
轴均匀地间隔标签(自动放置在正确的y
值上)。如果你愿意,你可以只传递一个数组,其中包含每个标签的x坐标。您甚至可以调整一个标签的位置(如右下角图所示),并根据需要均匀地间隔其余标签。此外,
label_lines
函数不考虑在plot
命令中没有分配标签的行(或者更准确地说,如果标签包含'_line'
)。传递给
labelLines
或labelLine
的关键字参数将传递给text
函数调用(如果调用代码选择不指定,则会设置一些关键字参数)。问题
1
和10
注解所示。我甚至不确定这是否可以避免。y
位置会更好。x
轴值为float
s时才有效我晕
labelLines
函数假定所有数据系列跨越轴限制指定的范围。看看漂亮图片左上角的蓝色曲线。如果只有x
范围0.5
-1
的数据,那么我们就不可能在所需的位置(略小于0.2
)放置标签。this question是一个特别令人讨厌的例子。现在,代码没有智能地识别这种情况并重新排列标签,但是有一个合理的解决方案。labelLines函数接受xvals
参数;x
-由用户指定的值的列表,而不是整个宽度的默认线性分布。因此,用户可以决定将哪些x
值用于每个数据系列的标签放置。此外,我相信这是第一个答案,以完成 * 奖金 * 的目标,对齐标签与曲线,他们的。:)
label_lines.py:
生成上面漂亮图片的测试代码:
8wigbo562#
@Jan Kuiken的回答当然是经过深思熟虑和透彻的,但也有一些警告:
一种更简单的方法是注解每个图的最后一个点。这一点也可以圈起来,以强调。这可以通过一个额外的行来实现:
一个变体是to use方法
matplotlib.axes.Axes.annotate
。2eafrhcq3#
问得好,不久前我用这个做了一点实验,但没有用过很多,因为它仍然不是防弹的。我将绘图区域划分为32x32网格,并根据以下规则计算了每行标签的最佳位置的“势场”:
代码是这样的:
以及由此产生的图:
jv2fixgn4#
matplotx(我写的)有
line_labels()
,它将标签绘制在线条的右侧。当太多的线集中在一个点时,它也足够聪明,可以避免重叠。(参见stargraph的例子。)它通过解决一个特定的非负最小二乘问题的目标位置的标签。无论如何,在许多情况下,没有重叠开始,如下面的例子,这是没有必要的。km0tfn4u5#
一个更简单的方法,如Ioannis Filippidis所做的:
code python 3 on sageCell