如何使用Pyplot Python更改文本框的绘制位置?

2024-10-01 17:29:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在计算图形中用户指定部分的斜率。如果他们选择在图形本身上绘制坡度,则绘制为:

enter image description here

如您所见,文本框相对于轴有一个zorder,该轴将文本框置于前端,即打印线和网格线上方。但它正被人物的边界所覆盖。我不确定哪种方法是解决此问题的“正确”方法,但以下是我很想找到但运气不佳的解决方案:

  1. 在“最顶层”层上绘制文本框,包括参考图形,而不仅仅是轴(因为zorder仅由轴引用,我不确定如果有轴,这将是什么属性?)
  2. 设置从左下角到右下角绘制文本框的定位点,这样文本将只延伸到绘图中,而不会延伸到边框。我在Pyplot中找到的唯一与文本框相关的锚定信息与图例类似;指定位置或坐标来确定其位置(我现在使用坐标来精确地将文本框绘制在用户指定区域的中间,并且在y轴上对应的值)
  3. 使用transform属性将文本框向右移动指定数量的单位,但是,正在打印的数据有时有数万个数据点,如果transform只是想要一个数字来按轴坐标移动文本框,尝试“猜测”转换似乎效率很低。如果我要使用transform属性,我希望有一种方法可以根据文本框本身的长度来移动它,而文本框一旦创建,就是静态的。然而,在不同的绘图中,其长度可能会发生变化,因为如果用户愿意,可以选择将坡度命名为有意义的名称。从这个意义上讲,我不确定如何以一致、可预测的方式使用transform属性

如果有任何其他方法最适合我的目的的话,我当然非常愿意接受教育,这些都是我头脑中简单的方法,我认为这项研究尚未取得成果

我非常感谢任何对如何解决这个问题有任何建议的人

谢谢大家!

编辑:找到解决方案

我研究了潜在的解决方案3,并想出了解决问题的方法

我首先将文本框保存为引用,而不是简单地打印它:

t = ax.text( insert parameters )

然后我使用了t_object = t.get_windows_extent( insert corresponding figure's renderer )

此bbox对象具有我可以访问的宽度和高度属性,但它们是以显示单位表示的,即显示屏幕上使用的像素数

使用transform,我将这些BBox坐标的显示单位转换为数据单位(以匹配轴的单位):

inv = ax.transData.inverted() # this allows the inversion of transform from display to Data
t_xy0 = inv.transform([t_object.x0, t_object.y0])
t_xy1 = inv.transform([t_object.x1, t_object.y1])

t_xy0和t_xy1现在是1d数组,包含包含bbox对象(左下角、右上角)的文本框的起点和终点的坐标,这些单位以数据单位表示

从这里很容易获得文本框的宽度并创建新的x位置变量:

t_width_axes = t_xy1[0] - t_xy0[0]
new_x_pos = x_axis_scale - t_width_axes # x_axis_scale being my original x coordinate for drawing the textbox in Data units

最后,我使用艺术家的(t)方法set_position()为文本框提供新的x坐标:

t.set_position(new_x_pos, y_axis_scale)

通过这些步骤,无论坡度的名称有多长,我的图形现在在绘制的文本框中都是这样的:

New plot with transformed textbox

我希望我的努力能帮助其他遇到这种情况的人,但我仍在寻求任何可能更简单的方法来完成这项工作的反馈

干杯


Tags: 数据方法用户图形属性object绘制transform

热门问题