在 matplotlib 中注释数据范围 [英] Annotating ranges of data in matplotlib
问题描述
如何注释我的数据范围?例如,假设从 x = 5
到 x = 10
的数据大于一些截止值,那么我怎么在图形上指出这一点.如果我手动注释,我只会在范围上方画一个大括号,然后在括号上方写上我的注释.
How can I annotate a range of my data? E.g., say the data from x = 5
to x = 10
is larger than some cut-off, how could I indicate that on the graph. If I was annotating by hand, I would just draw a large bracket above the range and write my annotation above the bracket.
我所看到的最接近的是使用 arrowstyle ='<->'
和 connectionstyle ='bar'
,使两个箭头指向用一条连接尾巴的线来显示您的数据.但这并不完全正确.您为注释输入的文本将最终在箭头之一的下方,而不是在栏上方.
The closest I've seen is using arrowstyle='<->'
and connectionstyle='bar'
, to make two arrows pointing to the edges of your data with a line connecting their tails. But that doesn't quite do the right thing; the text that you enter for the annotation will end up under one of the arrows, rather than above the bar.
这是我的尝试,以及它的结果:
Here is my attempt, along with it's results:
annotate(' ', xy=(1,.5), xycoords='data',
xytext=(190, .5), textcoords='data',
arrowprops=dict(arrowstyle="<->",
connectionstyle="bar",
ec="k",
shrinkA=5, shrinkB=5,
)
)
我尝试的解决方案的另一个问题是注释括号的方形形状并不能真正使我清楚地突出显示一个范围(与花括号不同).但是我想这只是在挑剔.
Another problem with my attempted solution is that the squared shape of the annotating bracket does not really make it clear that I am highlighting a range (unlike, e.g., a curly brace). But I suppose that's just being nitpicky at this point.
推荐答案
你可以把它全部封装在一个函数中:
You can just wrap it all up in a function:
def add_range_annotation(ax, start, end, txt_str, y_height=.5, txt_kwargs=None, arrow_kwargs=None):
"""
Adds horizontal arrow annotation with text in the middle
Parameters
----------
ax : matplotlib.Axes
The axes to draw to
start : float
start of line
end : float
end of line
txt_str : string
The text to add
y_height : float
The height of the line
txt_kwargs : dict or None
Extra kwargs to pass to the text
arrow_kwargs : dict or None
Extra kwargs to pass to the annotate
Returns
-------
tuple
(annotation, text)
"""
if txt_kwargs is None:
txt_kwargs = {}
if arrow_kwargs is None:
# default to your arrowprops
arrow_kwargs = {'arrowprops':dict(arrowstyle="<->",
connectionstyle="bar",
ec="k",
shrinkA=5, shrinkB=5,
)}
trans = ax.get_xaxis_transform()
ann = ax.annotate('', xy=(start, y_height),
xytext=(end, y_height),
transform=trans,
**arrow_kwargs)
txt = ax.text((start + end) / 2,
y_height + .05,
txt_str,
**txt_kwargs)
if plt.isinteractive():
plt.draw()
return ann, txt
或者,
start, end = .6, .8
ax.axvspan(start, end, alpha=.2, color='r')
trans = ax.get_xaxis_transform()
ax.text((start + end) / 2, .5, 'test', transform=trans)
这篇关于在 matplotlib 中注释数据范围的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!