获取Matplotlib绘制标签坐标

时间:2017-02-10 09:09:27

标签: python matplotlib

我想访问图中的所有标签坐标。

例如,我画了2行并显示了一个图例:

import matplotlib.pyplot as plt
plt.plot([1,2],label="first_image")
plt.plot([2,1],label="second_image")
plt.legend()
plot.show()

我想获得下图中所有带圆圈的标签的位置:

enter image description here

2 个答案:

答案 0 :(得分:1)

您可以使用get_window_extent()方法在窗口坐标中获得大多数艺术家的位置。

为了能够使用此方法,艺术家需要先前已绘制到画布。这可以通过plt.gcf().canvas.draw()手动触发。

import matplotlib.pyplot as plt
plt.plot([1,2],label="first_image")
plt.plot([2,1],label="second_image")
leg = plt.legend()

plt.gcf().canvas.draw()
ticks = [t for t in plt.gca().get_xticklabels()]
for i, t in enumerate(ticks):
    print "Label {}, data: {}".format(i, t.get_text()), t.get_window_extent()
print "Legend location: ", leg.get_window_extent()
for i, l in enumerate(leg.texts):
    print "Label {}, {}".format(i, l.get_text()), l.get_window_extent()
plt.show()

这将打印所有相关坐标

Label 0, data:  Bbox(x0=102.545454545, y0=43.0777777778, x1=102.545454545, y1=43.0777777778)
Label 1, data: 0.0 Bbox(x0=91.6079545455, y0=29.0777777778, x1=113.482954545, y1=43.0777777778)
Label 2, data: 0.2 Bbox(x0=181.789772727, y0=29.0777777778, x1=203.664772727, y1=43.0777777778)
Label 3, data: 0.4 Bbox(x0=271.971590909, y0=29.0777777778, x1=293.846590909, y1=43.0777777778)
Label 4, data: 0.6 Bbox(x0=362.090909091, y0=29.0777777778, x1=384.090909091, y1=43.0777777778)
Label 5, data: 0.8 Bbox(x0=452.272727273, y0=29.0777777778, x1=474.272727273, y1=43.0777777778)
Label 6, data: 1.0 Bbox(x0=542.454545455, y0=29.0777777778, x1=564.454545455, y1=43.0777777778)
Label 7, data:  Bbox(x0=102.545454545, y0=43.0777777778, x1=102.545454545, y1=43.0777777778)
Legend location:  Bbox(x0=419.305555556, y0=214.431597222, x1=569.055555556, y1=260.768402778)
Label 0, first_image Bbox(x0=463.75, y0=241.072222222, x1=541.375, y1=255.212847222)
Label 1, second_image Bbox(x0=463.75, y0=219.987152778, x1=563.5, y1=234.127777778)

但请注意,一般不要求或建议将这些坐标用于图中的任何操作,因为它们可能会因每次重绘而改变。根据使用情况,可能有更好的方法来实现某个目标。

另请注意,这些坐标不一定是保存图像中的像素坐标。这些将取决于dpi设置,这可能在屏幕上和保存的图像之间有所不同。用于保存的后端也可以重绘画布,这可能会改变坐标。

答案 1 :(得分:0)

假设您要重新定位图例,可以使用类似的内容..

import matplotlib.pyplot as plt

line1, = plt.plot([1,2],label="first_image", linestyle='--')
line2, = plt.plot([2,1],label="second_image", linewidth=4)

# Create a legend for the first line.
first_legend = plt.legend(handles=[line1], loc=1)

# Add the legend manually to the current Axes.
ax = plt.gca().add_artist(first_legend)

# Create another legend for the second line.
plt.legend(handles=[line2], loc=4)

plt.show()

或者,您可以使用matplotlib.legend_handlerAxis.set_label_position